首页 > 解决方案 > 如何在同一个执行器上拆分 Spark 中的分区?(合并的反面)

问题描述

有没有什么方法可以在不通过网络和 shuffle 的情况下拆分 Spark 分区,例如

# p stands for partition
machine 1:
p1: 1,2 p2: 3,4
machine 2:
p3: 5,6 p4: 7,8

我想要的是

machine 1: 
p1:1, p2:2, p3:3, p4:4
machine 2:
p5:5, p6:6, p7:7, p8:8

有没有办法做到这一点?(我认为这里没有网络传输和洗牌)

PS:

这是相反的coalesce,如果我打电话,coalesce(2)那么我想它会是

machine 1: p1: 1,2,3,4 machine 2: p2: 5,6,7,8

哪里数据不通过网络,不会调用shuffle,并且coalesce(1)会因为机器2中的数据都到机器1而导致网络传输?

标签: apache-spark

解决方案


如果repartition应用程序代码以某种方式编写,API 可以提供帮助

  1. 读取数据集并使用 column 重新分区a。这将导致跨网络的完全洗牌,这意味着为 的每个唯一值创建一个分区a

  2. 一旦步骤 1 完成,如果您现在对列上的数据集进行重新分区ab这将导致以最少的随机播放创建新分区。

您可以在此处阅读有关 Hash Partitioner 的更多信息 - HashPartitioner 如何工作?


推荐阅读