繁体   English   中英

在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')

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

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包含no id value ,以同样的方式(如果您编写parquet file ,part-*。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的答案也可以用于调查。

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


如果您确实不想仅查看这些列,则可以在此表的顶部放置一个不包含这些列的视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM