在 pyspark 中写入镶木地板时删除分区列
Drop partition columns when writing parquet in pyspark
我有一个带有日期列的数据框。我已将其解析为年、月、日列。我想对这些列进行分区,但我不希望这些列保留在镶木地板文件中。
这是我分区和写入数据的方法:
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 文件,包括嵌套的文件夹结构。但是我不想要镶木地板文件中的年、月或日列。
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
如您所见,no id value
包含在 csv 文件 中,如果您编写 [= =34=]parquet file
分区列未包含在part-*.parquet文件中。
检查 parquet 文件的模式:
parquet-tools schema <hdfs://nn:8020/parquet_file>
您还可以验证镶木地板文件中包含的所有列。
如果你使用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的回答也可以用来调查。
这些列不会占用存储空间,您大可放心space。
如果您真的不想简单地查看这些列,您可以在此 table 之上放置一个视图,排除这些列。
我有一个带有日期列的数据框。我已将其解析为年、月、日列。我想对这些列进行分区,但我不希望这些列保留在镶木地板文件中。
这是我分区和写入数据的方法:
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 文件,包括嵌套的文件夹结构。但是我不想要镶木地板文件中的年、月或日列。
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
如您所见,no id value
包含在 csv 文件 中,如果您编写 [= =34=]parquet file
分区列未包含在part-*.parquet文件中。
检查 parquet 文件的模式:
parquet-tools schema <hdfs://nn:8020/parquet_file>
您还可以验证镶木地板文件中包含的所有列。
如果你使用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的回答也可以用来调查。
这些列不会占用存储空间,您大可放心space。
如果您真的不想简单地查看这些列,您可以在此 table 之上放置一个视图,排除这些列。