Apache spark 重新划分分区数据

Apache spark 重新划分分区数据,apache-spark,pyspark,Apache Spark,Pyspark,我正在处理一个数据倾斜的问题,比如我的最小分区低于64MB,而最大分区可以大于1GB。我一直在考虑一种策略,将几个小分区映射到同一个分区键,从而创建一个由多个分区组成的分区。这一切都是为了减少任务大小和磁盘上存储的文件数量的差异 在我的Spark应用程序中,有一次我需要对(未分组的)原始分区进行操作,为此,需要按原始密钥重新分区。这就引出了我的问题: 假设我有两个数据集,如下所示。每一行都是一个元组,其形式为(分区键,(原始键,数据))。在数据0中,您可以看到原始_key=0位于其自己的节点上,

我正在处理一个数据倾斜的问题,比如我的最小分区低于64MB,而最大分区可以大于1GB。我一直在考虑一种策略,将几个小分区映射到同一个分区键,从而创建一个由多个分区组成的分区。这一切都是为了减少任务大小和磁盘上存储的文件数量的差异

在我的Spark应用程序中,有一次我需要对(未分组的)原始分区进行操作,为此,需要按原始密钥重新分区。这就引出了我的问题:

假设我有两个数据集,如下所示。每一行都是一个元组,其形式为(分区键,(原始键,数据))。在数据0中,您可以看到原始_key=0位于其自己的节点上,而原始_key=4和原始_key=5位于包含分区_key=3的节点上。在数据1中,事情没有组织得那么有序

如果data0是按partition\u键进行分区的,然后按original\u键进行分区,是否会发生混洗?换句话说,在第二次partitionBy调用期间,data0data1更有条理,这是否重要

data0 = [
    (0, (0, 'a')),
    (0, (0, 'b')),
    (0, (0, 'c')),
    (1, (1, 'd')),
    (1, (1, 'e')),
    (1, (2, 'f')),
    (1, (2, 'g')),
    (2, (3, 'h')),
    (2, (3, 'i')),
    (2, (3, 'j')),
    (3, (4, 'k')),
    (3, (4, 'l')),
    (3, (5, 'm')),
    (3, (5, 'n')),
    (3, (5, 'o')),
]

data1 = [
    (0, (0, 'a')),
    (1, (0, 'b')),
    (0, (0, 'c')),
    (1, (1, 'd')),
    (2, (1, 'e')),
    (1, (2, 'f')),
    (3, (2, 'g')),
    (2, (3, 'h')),
    (0, (3, 'i')),
    (3, (3, 'j')),
    (3, (4, 'k')),
    (3, (4, 'l')),
    (1, (5, 'm')),
    (2, (5, 'n')),
    (3, (5, 'o')),
]

rdd0 = sc.parallelize(data0, 3).cache()
partitioned0 = rdd0.partitionBy(4)
partitioned0.map(lambda row: (row[1][0], row[1])).partitionBy(6).collect()

rdd1 = sc.parallelize(data1, 3).cache()
partitioned1 = rdd1.partitionBy(4)
partitioned1.map(lambda row: (row[1][0], row[1])).partitionBy(6).collect()

当你调用重新分区时,洗牌就开始了。 有多少数据被洗牌是基于原始RDD的


作为旁注:当您执行sc.parallelize(data0,3)时,3仅仅是指导原则。如果默认分区是,我不确定我是否明白了。所以你实际上是想把分区变大?我可能更应该关注大分区的重新分配。关于手头的问题-如果新键、分区器和分区数相同,则不应移动数据。因此,从某种意义上说,“更有条理”将减少要洗牌的数据量。