【问题标题】:Write out spark df as single parquet file in databricks在数据块中将 spark df 写为单个镶木地板文件
【发布时间】:2023-02-13 03:37:11
【问题描述】:
我有一个类似下面的数据框:
| Filename |
col1 |
col2 |
| file1 |
1 |
1 |
| file1 |
1 |
1 |
| file2 |
2 |
2 |
| file2 |
2 |
2 |
我需要将其保存为按文件名分区的镶木地板。当我使用df.write.partitionBy("Filename").mode("overwrite").parquet(file_out_location)
它创建了 2 个文件夹(基于分区)作为 Filename=file1 和 Filename=file1 以及里面的许多零件文件。
如何将它保存为每个分区目录中的单个文件,例如文件名=file1.parquet 和文件名=file2.parquet?
【问题讨论】:
标签:
apache-spark
pyspark
databricks
parquet
【解决方案1】:
这会起作用:
row = df.selectExpr("cast(count(DISTINCT(FileName)) as int) as cnt").head();
df
.repartition(row["cnt"], F.col("FileName"))
.write()
.partitionBy("FileName")
.parquet("output-folder-path/");
本质上,您需要根据您打算在 partitionBy() 中使用的相同列对内存数据帧进行分区。如果不像上面那样提供 row["cnt"] - 它将默认为 spark.sql.shuffle.partitions 分区。
以上将根据分区列为每个分区生成一个文件。
没有重新分区:
重新分区: