PyS2:RDD编程基础(二)

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

5. 分区相关的操作

分区的作用主要是增加并行度和减少通信开销。增加并行度就不需要多说了,我们主要来聊一聊减少通信开销。我看书上的意思大概是说分区之后避免了后续处理当中的Shuffle操作,意思是已经把数据给排列好了的感觉,所以说不用后面一次又一次地重新Shuffle

分区默认的方法有HashPartitionerRangePartitioner,前者是根据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默认的shuffleFalse,只能减少分区的数量,如果想要增加分区可以调整为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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值