Apache spark Pyspark:重新分区与分区方式
我现在正在研究这两个概念,希望能澄清一下。通过使用命令行,我一直在尝试确定不同之处,以及开发人员何时会使用重新分区与分区方式 以下是一些示例代码:Apache spark Pyspark:重新分区与分区方式,apache-spark,pyspark,rdd,Apache Spark,Pyspark,Rdd,我现在正在研究这两个概念,希望能澄清一下。通过使用命令行,我一直在尝试确定不同之处,以及开发人员何时会使用重新分区与分区方式 以下是一些示例代码: rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 1), ('b', 3), ('c',1), ('ef',5)]) rdd1 = rdd.repartition(4) rdd2 = rdd.partitionBy(4) rdd1.glom().collect() [[('b', 1), ('ef',
rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 1), ('b', 3), ('c',1), ('ef',5)])
rdd1 = rdd.repartition(4)
rdd2 = rdd.partitionBy(4)
rdd1.glom().collect()
[[('b', 1), ('ef', 5)], [], [], [('a', 1), ('a', 2), ('b', 3), ('c', 1)]]
rdd2.glom().collect()
[[('a', 1), ('a', 2)], [], [('c', 1)], [('b', 1), ('b', 3), ('ef', 5)]]
我研究了这两种方法的实现,我注意到的唯一区别是,partitionBy可以使用分区函数,或者默认情况下使用portable_散列。所以在partitionBy中,所有相同的键都应该在同一个分区中。在重新分区中,我希望值在分区上分布更均匀,但事实并非如此
鉴于此,为什么会有人使用重新分区?我想我唯一能看到它被使用的时候是我没有使用pairdd,或者我有很大的数据倾斜
是否有我遗漏的东西,或者有人能从另一个角度为我解释一下吗?
重新分区
已经存在于RDD中,并且不处理按键(或除排序之外的任何其他标准)进行分区。现在pairrds添加了键的概念,并随后添加了另一种方法,允许按该键进行分区
因此,是的,如果您的数据是键控的,那么您应该绝对按照该键进行分区,在许多情况下,首先使用PairRDD(用于连接、reduceByKey等)。repartition()
用于指定分区的数量,考虑到核心的数量和您拥有的数据量
partitionBy()
用于提高洗牌函数的效率,例如reduceByKey()
,join()
,cogroup()
等。。它只在RDD被多次使用的情况下才有用,因此它后面通常跟有persist()
两者之间的差异:
pairs = sc.parallelize([1, 2, 3, 4, 2, 4, 1, 5, 6, 7, 7, 5, 5, 6, 4]).map(lambda x: (x, x))
pairs.partitionBy(3).glom().collect()
[[(3, 3), (6, 6), (6, 6)],
[(1, 1), (4, 4), (4, 4), (1, 1), (7, 7), (7, 7), (4, 4)],
[(2, 2), (2, 2), (5, 5), (5, 5), (5, 5)]]
pairs.repartition(3).glom().collect()
[[(4, 4), (2, 2), (6, 6), (7, 7), (5, 5), (5, 5)],
[(1, 1), (4, 4), (6, 6), (4, 4)],
[(2, 2), (3, 3), (1, 1), (5, 5), (7, 7)]]
重新分区没有在分区之间均匀分布元素的原因是什么?这可能是我没有足够的数据,而我们遇到了小样本问题的情况吗?好问题,我在尝试时(在Scala中)看到了一个均匀分布。@JoeWiden除了一个简单的概率,没有别的
repartition
实际上是通过向现有值添加随机键在内部使用pair-RDD,因此它不会对输出数据分布提供强有力的保证。顺便说一句,您可能应该接受这个答案。@MariusSoutier实际上,Spark中的任何重新分区都是使用成对RDD处理的。如果需要,Spark只需添加虚拟关键点或虚拟值即可工作。