【发布时间】:2018-11-24 00:22:26
【问题描述】:
假设我们有一个 PySpark 数据帧,其中数据均匀分布在 2048 个分区中,我们希望合并到 32 个分区以将数据写回 HDFS。使用coalesce 非常适合,因为它不需要昂贵的随机播放。
但是coalesce 的缺点之一是它通常会导致数据在新分区中的分布不均匀。我假设这是因为原始分区 ID 被散列到新的分区 ID 空间,并且冲突的数量是随机的。
但是,原则上应该可以均匀合并,以便将原始数据帧的前 64 个分区发送到新数据帧的第一个分区,接下来的 64 个分区发送到第二个分区,如此结束,导致分区分布均匀。生成的数据帧通常更适合进一步计算。
这是否可能,同时防止洗牌?
我可以使用this question 中的技巧来强制在初始分区和最终分区之间建立我想要的关系,但是 Spark 不知道每个原始分区中的所有内容都将转到特定的新分区。因此它无法优化掉 shuffle,而且它的运行速度比 coalesce 慢得多。
【问题讨论】:
-
感谢您编辑答案,并对造成的误解深表歉意。为什么你认为合并会不均匀地分布数据?如果当前分区数是所需分区数的倍数,我希望每个新分区在合并后的沿袭中具有偶数个上游分区。这对你有意义吗?无论如何我都会检查代码。
-
检查并添加了一个新答案,您可以安全地合并,并且在保持均匀性的同时不会洗牌。 :)
标签: apache-spark pyspark partitioning