Join PySpark加入洗牌共分区RDD

Join PySpark加入洗牌共分区RDD,join,apache-spark,pyspark,partitioning,Join,Apache Spark,Pyspark,Partitioning,这些RDD具有相同的分区: from pyspark import SparkContext sc = SparkContext() rdd1 = sc.parallelize([('a', 1), ('b', 2), ('c', 3), ('d', 4)], numSlices=8) rdd2 = rdd1.mapValues(lambda x: x) 这里有多个答案,这表明加入共分区数据不会导致混乱,这对我来说很有意义。例如: 但是,当我使用PySpark加入这些共分区RDD时,数据会

这些RDD具有相同的分区:

from pyspark import SparkContext

sc = SparkContext()

rdd1 = sc.parallelize([('a', 1), ('b', 2), ('c', 3), ('d', 4)], numSlices=8)
rdd2 = rdd1.mapValues(lambda x: x)
这里有多个答案,这表明加入共分区数据不会导致混乱,这对我来说很有意义。例如:

但是,当我使用PySpark加入这些共分区RDD时,数据会被洗牌到一个新分区中:

rdd1.keys().glom().collect()
>>> [[], ['a'], [], ['b'], [], ['c'], [], ['d']]

rdd2.keys().glom().collect()
>>> [[], ['a'], [], ['b'], [], ['c'], [], ['d']]
即使我将新分区的数量设置为原来的8,分区也会发生变化:

rdd1.join(rdd2).keys().glom().collect()
>>> [['a'], [], ['c'], ['b'], [], ['d'], [], [], [], [], [], [], [], [], [], []]
为什么我不能避免使用这些共分区RDD进行洗牌


我使用的是Spark 1.6.0。

在这种情况下,
rdd1
rdd2
都没有分区

rdd1=sc.parallelize([('a',1),('b',2),('c',3),('d',4)])
rdd2=rdd1.mapValues(λx:x)
rdd1.partitioner是None
##真的
rdd2.partitioner是None
#真的
因此,根据定义,没有共同分区。虽然您可以对数据进行分区并加入:

n=rdd1.getNumPartitions()
rdd1part=rdd1.partitionBy(n)
rdd2part=rdd2.partitionBy(n)
join(rdd2part)#rdd1part和rdd2part是共同分区的
这只会重新排列DAG,不会阻止洗牌


另请参见

谢谢,这可能正好解决了我面临的问题。不过,我很惊讶,设置
numSlices
并不意味着显式分区。(我想现在我明白了为什么它不像在其他函数中那样被称为
numPartitions
)当我们在Spark中谈论分区时,我们指的是两个不同的概念。你可以查看我对的回答,以获得一些解释。
rdd1.join(rdd2, numPartitions=8).keys().glom().collect()
>>> [['a'], [], ['c'], ['b'], [], ['d'], [], []]