如何使用带有已定义架构的Spark df.write.parquet编写Parquet文件。 -pyspark

时间:2018-08-09 23:36:31

标签: json apache-spark dataframe pyspark parquet

我正在使用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),
    ])

也许是一个很长的问题。帮助将不胜感激。谢谢

2 个答案:

答案 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)

希望它对您有帮助。