【发布时间】:2016-11-28 01:53:18
【问题描述】:
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)
这些 RDD 具有相同的分区:
rdd1.keys().glom().collect()
>>> [[], ['a'], [], ['b'], [], ['c'], [], ['d']]
rdd2.keys().glom().collect()
>>> [[], ['a'], [], ['b'], [], ['c'], [], ['d']]
这里有多个答案表明加入共同分区的数据不会导致洗牌,这对我来说很有意义。示例:Does a join of co-partitioned RDDs cause a shuffle in Apache Spark?
但是,当我使用 PySpark 加入这些共同分区的 RDD 时,数据会被打乱到一个新的分区中:
rdd1.join(rdd2).keys().glom().collect()
>>> [['a'], [], ['c'], ['b'], [], ['d'], [], [], [], [], [], [], [], [], [], []]
即使我将新分区的数量设置为原来的 8 个,分区也会发生变化:
rdd1.join(rdd2, numPartitions=8).keys().glom().collect()
>>> [['a'], [], ['c'], ['b'], [], ['d'], [], []]
为什么我无法避免使用这些共同分区的 RDD 进行洗牌?
我使用的是 Spark 1.6.0。
【问题讨论】:
标签: join apache-spark pyspark partitioning