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]
]
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')]
]