簡體   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