• 重分区函数
  • 重新对RDD分区数量进行调整
repartition: 
    作用: 改变RDD的分区数量, 得到一个新的RDD, 可以增大分区, 也可以减少分区 存在shuffle

    演示:
    rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10],3)

    查看各个分区的结果:
    rdd.glom().collect()
    结果:
    [
        [1, 2, 3], 
        [4, 5, 6], 
        [7, 8, 9, 10]
    ] 

    尝试增大分区操作:
    rdd.repartition(5).glom().collect()
    结果:
        [
            [], 
            [1, 2, 3], 
            [7, 8, 9, 10], 
            [4, 5, 6], 
            []
        ]
    尝试减少分区操作: 
    rdd.repartition(2).glom().collect()
    结果:
        [
            [1, 2, 3, 7, 8, 9, 10], 
            [4, 5, 6]
        ]


coalesce(N)函数:
    作用: 改变RDD得分区数量, 得到一个新的RDD, 默认无法增大分区,但是可以减少分区 默认没有Shuffle

    演示:
    rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10],3)

    查看各个分区的结果:
    rdd.glom().collect()
    结果:
    [
        [1, 2, 3], 
        [4, 5, 6], 
        [7, 8, 9, 10]
    ] 

    尝试增大分区:
    rdd.coalesce(5).glom().collect()
    结果:
    [
        [1, 2, 3], 
        [4, 5, 6], 
        [7, 8, 9, 10]
    ]

    尝试减少分区:
    rdd.coalesce(2).glom().collect()
    结果:
    [
        [1, 2, 3], 
        [4, 5, 6, 7, 8, 9, 10]
    ]
    # 参数2: 表示是否存在shuffle, 默认为false, 但是只能减少分区
    rdd.coalesce(5,True).glom().collect()
    结果:
    [
        [], 
        [1, 2, 3], 
        [7, 8, 9, 10], 
        [4, 5, 6],
        []
    ]

说明:
    repartition本质上是coalesce的一种当参数2为True的简写方案,  因为repartition底层调用coalesce函数,将其参数2设置为True
    联系:
        repartition底层调用coalesce, 只是将coalesce的参数2设置为True
        两个函数都是可以进行重分区操作的


partitionBy: 专门针对kv类型重分区的函数

作用: 改变RDD的分区数量, 得到一个新的RDD, 可以增大分区, 也可以减少分区, 会产生shuffle

默认: 根据key进行Hash取模划分操作 如果不满足这个分区的故障, 也可以自定义分区规则

注意: 分区的编号, 也是从0开始的

演示: 
rdd = sc.parallelize([(1,'c01'),(2,'c02'),(3,'c03'),(4,'c04'),(5,'c05'),(6,'c06'),(7,'c07'),(8,'c08'),(9,'c09'),(10,'c10')],3)

查看各个分区的结果:
rdd.glom().collect()

[
    [(1, 'c01'), (2, 'c02'), (3, 'c03')], 
    [(4, 'c04'), (5, 'c05'), (6, 'c06')], 
    [(7, 'c07'), (8, 'c08'), (9, 'c09'), (10, 'c10')]
]

尝试进行重分区操作:
rdd.partitionBy(5).glom().collect()
结果:
[
    [(5, 'c05'), (10, 'c10')], 
    [(1, 'c01'), (6, 'c06')], 
    [(2, 'c02'), (7, 'c07')], 
    [(3, 'c03'), (8, 'c08')], 
    [(4, 'c04'), (9, 'c09')]
]


需求, 请分为二个分区, 要求 大于5的在一个分区, 小于等于5的在一个分区
rdd.partitionBy(2).glom().collect()
结果:
[
    [(2, 'c02'), (4, 'c04'), (6, 'c06'), (8, 'c08'), (10, 'c10')], 
    [(1, 'c01'), (3, 'c03'), (5, 'c05'), (7, 'c07'), (9, 'c09')]
]
并未实现需求 依然是根据Hash方式

此时需要自定义分区逻辑:
rdd.partitionBy(2,lambda key: 0 if key <= 5 else 1).glom().collect()
结果:
[
    [(1, 'c01'), (2, 'c02'), (3, 'c03'), (4, 'c04'), (5, 'c05')],
    [(6, 'c06'), (7, 'c07'), (8, 'c08'), (9, 'c09'), (10, 'c10')]
]