【问题标题】:Drop partition columns when writing parquet in pyspark在 pyspark 中写入 parquet 时删除分区列
【发布时间】:2019-06-24 20:58:40
【问题描述】:

我有一个带有日期列的数据框。我已将其解析为年、月、日列。我想对这些列进行分区,但我不希望这些列保留在 parquet 文件中。

这是我对数据进行分区和写入的方法:

df = df.withColumn('year', f.year(f.col('date_col'))).withColumn('month',f.month(f.col('date_col'))).withColumn('day',f.dayofmonth(f.col('date_col')))

df.write.partitionBy('year','month', 'day').parquet('/mnt/test/test.parquet')

这会正确创建镶木地板文件,包括嵌套文件夹结构。但是,我不希望 parquet 文件中包含年、月或日列。

【问题讨论】:

    标签: python apache-spark pyspark databricks


    【解决方案1】:

    Spark/Hive 不会在您的 parquet files 中写入 year,month,day 列,因为它们已经在 partitionBy 子句。

    示例:

    val df=Seq((1,"a"),(2,"b")).toDF("id","name")
    df.coalesce(1).write.partitionBy("id").csv("/user/shu/temporary2") //write csv file.
    

    检查 csv 文件的内容:

    hadoop fs -cat /user/shu/temporary2/id=1/part-00000-dc55f08e-9143-4b60-a94e-e28b1d7d9285.c000.csv
    

    输出:

    a
    

    如您所见,csv 文件 中包含 no id value,与您编写 parquet file 分区的方式相同列不包含在 part-*.parquet 文件中。


    检查 parquet 文件的架构:

    parquet-tools schema <hdfs://nn:8020/parquet_file>
    

    您还可以验证 parquet 文件中包含的所有列。

    【讨论】:

      【解决方案2】:

      如果您使用df.write.partitionBy('year','month', 'day')

      这些列实际上以物理方式存储在文件数据中。它们只是通过partitionBy 创建的文件夹结构呈现。

      例如。 partitionBy('year').csv("/data") 将创建类似:

      /data/year=2018/part1---.csv
      /data/year=2019/part1---.csv
      

      当您读回数据时,它使用特殊路径 year=xxx 填充这些列。

      您可以通过直接读入一个单个分区的数据来证明这一点。

      例如。在这种情况下,year 将不是一列。

      df = spark.read.csv("data/year=2019/")
      df.printSchema()
      

      @Shu 的回答也可以用来调查。

      这些列不占用存储空间,您可以放心入睡。


      如果您真的不想简单地查看列,您可以在此表的顶部放置一个视图,排除这些列。

      【讨论】:

        猜你喜欢
        • 2020-07-23
        • 2020-05-11
        • 1970-01-01
        • 2022-01-16
        • 2017-12-03
        • 1970-01-01
        • 2021-09-17
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多