我正在使用df.write将JSON转换为实木复合地板文件。在我的JSON文件中,我所有的列都是字符串,因此在读入数据框时,我正在使用架构进行推断,并且文件中没有列的原因也在不断变化。在写实木复合地板时,我不想将它们写为字符串,而是希望某些列更改为日期和小数。我知道我们可以在捕获到另一个df之前选择并在df select中进行列级别的转换。我不想这样做,因为我在文件中有300列,并且程序根据参数进行工作。有没有一种方法可以将它们作为模式包含在文件中并执行。
示例:
JSON读取模式:
read_schema = StructType([
StructField("event_name" , StringType(), True),
StructField("dollar_balance" , StringType(), True),
])
镶木地板写模式:
write_schema = StructType([
StructField("event_name" , StringType(), True),
StructField("dollar_balance" , DoubleType(), True),
])
也许是一个很长的问题。帮助将不胜感激。谢谢
答案 0 :(得分:1)
您应选择带有cast
的列,然后将数据帧的rdd绑定到write_schema
。例如:
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, DoubleType
spark = SparkSession\
.builder\
.appName("Write parquet")\
.master("local[*]")\
.getOrCreate()
sc = spark.sparkContext
df1 = spark.read.json("/path/to/json-file.json")
write_schema = StructType([
StructField("event_name", StringType(), True),
StructField("dollar_balance", DoubleType(), True),
])
spark.createDataFrame(
df1.select(df1["event_name"], df1["dollar_balance"].cast(DoubleType()).alias("dollar_balance")).rdd,
write_schema).show(10)
答案 1 :(得分:0)
请尝试以下操作。
df.write.option("schema",write_schema).parquet(savepath)
希望它对您有帮助。