PyS2:RDD编程基础(二)
5. 分区相关的操作
分区的作用主要是增加并行度和减少通信开销。增加并行度就不需要多说了,我们主要来聊一聊减少通信开销。我看书上的意思大概是说分区之后避免了后续处理当中的Shuffle操作,意思是已经把数据给排列好了的感觉,所以说不用后面一次又一次地重新Shuffle。
分区默认的方法有HashPartitioner和RangePartitioner,前者是根据Key进行分区,后者是为了更好地排序。
5.1 改变分区的函数
5.1.1 coalesce
>>> rdd = sc.parallelize([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],3)
>>> rdd.glom().collect()
[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]]
>>> rdd = rdd.coalesce(2)
>>> rdd.glom().collect()
[[0, 1, 2], [3, 4, 5, 6, 7, 8, 9]]
>>> rdd = rdd.coalesce(3, True)
>>> rdd.glom().collect()
[[], [0, 1, 2], [3, 4, 5, 6, 7, 8, 9]]
coalesce默认的shuffle是False,只能减少分区的数量,如果想要增加分区可以调整为True。但我看其他博客好像太建议这个函数,都是说慎重操作。
5.1.2 repartition
>>> rdd = sc.parallelize([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],3)
>>> rdd.glom().collect()
[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]]
>>> rdd = rdd.repartition(2)
>>> rdd.glom().collect()
[[0, 1, 2, 6, 7, 8, 9], [3, 4, 5]]
>>> rdd = rdd.repartition(3)
>>> rdd.glom().collect()
[[], [0, 1, 2], [6, 7, 8, 9, 3, 4, 5]]
>>> rdd = sc.parallelize([
... ('Mickey', 0),
... ('Mickey', 1),
... ('Mickey', 2),
... ('Minnie', 3),
... ('Minnie', 4),
... ('Pluto', 5),
... ('Goofy', 6),
... ('Goofy', 7),
... ('Donald', 8)
... ], 3)
>>> pprint(rdd.glom().collect())
[
[('Mickey', 0), ('Mickey', 1), ('Mickey', 2)],
[('Minnie', 3), ('Minnie', 4), ('Pluto', 5)],
[('Goofy', 6), ('Goofy', 7), ('Donald', 8)]
]
>>> rdd = rdd.repartition(2)
>>> pprint(rdd.glom().collect())
[
[
('Mickey', 0),
('Mickey', 1),
('Mickey', 2),
('Goofy', 6),
('Goofy', 7),
('Donald', 8)
],
[('Minnie', 3), ('Minnie', 4), ('Pluto', 5)]
]
>>> rdd = rdd.repartition(3)
>>> pprint(rdd.glom().collect())
[
[],
[('Mickey', 0), ('Mickey', 1), ('Mickey', 2)],
[
('Goofy', 6),
('Goofy', 7),
('Donald', 8),
('Minnie', 3),
('Minnie', 4),
('Pluto', 5)
]
]
>>>
该函数好像就是调用coalesce实现的操作,由于shuffle可以设定为True所以说能够增加分区的数量。具体分区的操作是按随机数进行,相同的Key不一定在同一个分区。
5.1.3 partitionBy
>>> rdd = sc.parallelize([
... ('Mickey', 0),
... ('Mickey', 1),
... ('Mickey', 2),
... ('Minnie', 3),
... ('Minnie', 4),
... ('Pluto', 5)
PySpark RDD 分区与操作详解

本文深入探讨了PySpark中的RDD分区及其重要性,包括如何通过coalesce、repartition和partitionBy改变分区。同时讲解了mapPartitions、mapPartitionsWithIndex、foreachPartitions、aggregate和aggregateByKey等基于分区的函数。另外,提到了缓存操作、广播变量和累加器在共享变量中的应用。最后,给出了几个RDD编程练习及解答,涵盖了平均数计算、众数查找、排序和分组等任务。
最低0.47元/天 解锁文章
1424

被折叠的 条评论
为什么被折叠?



