Spark 实现重新分区 partitionBy、coalesce、repartition(附代码演示)

文章目录

1、partitionBy

源码中的定义(部分):

调用方式

2、coalesce

源码中的定义:

调用方式

3、repartition

源码中的定义

调用方式 

repartition和coalesce的区别

代码演示 


实现重新分区,本质上就是重新配置并行度,也就是说,如果我们将分区数设置为n,那么Spark作业的并行度就是n

1、partitionBy

传入自定义的分区策略 默认为按照key进行hash

源码中的定义(部分):

def partitionBy(
    self: "RDD[Tuple[K, V]]",
    numPartitions: Optional[int],
    partitionFunc: Callable[[K], int] = portable_hash,
) -> "RDD[Tuple[K, V]]":


调用方式

rdd.partitionBy(参数1,参数2)

参数1,分区数

参数2,传入自定义的分区策略 默认为按照key进行hash


2、coalesce

coalesce既可以实现RDD分区的合并缩小,也可以实现RDD分区的扩大

源码中的定义:

def coalesce(self: "RDD[T]", numPartitions: int, shuffle: bool = False) -> "RDD[T]":

调用方式

rdd.coalesce(参数1,参数2)

参数1,传入分区个数

参数2,传入 shuffle,默认为 False,为False则不进行shuffle,带有分区捆绑进行重新分区

若shuffle = True, 则进行shuffle操作,不带有分区捆绑进行重新分区 分区更加均匀(避免数据倾斜)


3、repartition

返回一个新的RDD,它刚好有numPartitions(参数1)个分区。

源码中的定义

def repartition(self: "RDD[T]", numPartitions: int) -> "RDD[T]":

调用方式 

rdd.repartition(参数1)

参数1,分区数

可以增加或减少此RDD中的分区。在内部,它使用shuffle来重新分发数据。

如果正在减少这个RDD中的分区数量,考虑使用' coalesce',这可以避免执行shuffle。


repartition和coalesce的区别

repartition默认开启shuffle,

coalesce默认不开启,但可用参数配置,

实际上repartition底层调用的就是coalesce


代码演示 

# coding:utf8
import time

from pyspark import SparkConf, SparkContext

if __name__ == '__main__':
    conf = SparkConf().setAppName("test").setMaster("local[*]")
    sc = SparkContext(conf=conf)

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

    print(rdd.glom().collect())
    
    print(rdd.coalesce(2).glom().collect())
    print(rdd.coalesce(2, shuffle=True).glom().collect())
    
    print(rdd.repartition(2).glom().collect())
    

制作不易,点个赞吧~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电光火石尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值