Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Pyspark:重新分区与分区方式_Apache Spark_Pyspark_Rdd - Fatal编程技术网

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只需添加虚拟关键点或虚拟值即可工作。