Spark-写入 128 MB 大小的 parquet 文件

pul*_*gun 5 scala dataframe apache-spark apache-spark-sql

我有一个包含超过 10 亿行的 DataFrame (df)

df.coalesce(5)
.write
.partitionBy("Country", "Date")
.mode("append")
.parquet(datalake_output_path)
Run Code Online (Sandbox Code Playgroud)

从上面的命令我了解到我的 100 个工作节点集群 (spark 2.4.5) 中只有 5 个工作节点将执行所有任务。使用coalesce(5) 需要7 个小时才能完成该过程。

我应该尝试repartition而不是吗coalesce

是否有更快速/有效的方法来写出 128 MB 大小的镶木地板文件,或者我是否需要首先计算数据帧的大小以确定需要多少个分区。

例如,如果我的数据帧的大小为 1 GB 并且spark.sql.files.maxPartitionBytes = 128MB,我应该首先计算No. of partitions required as 1 GB/ 128 MB = approx(8)然后执行 repartition(8) 或合并(8) 吗?

这个想法是在撰写本文时最大化输出中的镶木地板文件的大小,并且能够快速(更快)地做到这一点。

Moh*_*ais 1

如果您从较高的分区数量转向较低的分区数量,则合并会更好。但是,如果在编写 df 之前,您的代码没有执行 shuffle ,那么合并将被下推到 DAG 中可能的最早点。您可以做的就是在 100 个分区或任何您认为合适的数量中处理您的 df,然后在写入 df 之前将其保留。然后使用合并将分区减少到 5 个并写入。这可能会给你带来更好的性能