PySpark学习笔记-数据分区

1.数据分区

在分布式程序中,通信的代价较大,通过对数据集在节点间的分区进行控制以获得较少的网络传输从而提升整体性能。如果给定的RDD只需要被扫描一次,则完全没有必要对其预先进行处理。只有当数据集多次在诸如连接这种基于键的操作中使用时,分区才会有帮助。

尽管Spark无法显示控制每个键具体落在哪一个工作节点,但Spark可以确保同一组的键出现在同一个节点上。

以Join操作为例,如果未根据RDD中的键重新分,那么在默认情况下,连接操作会将两个数据集中的所有键的哈希值求出来,将哈希值相同的记录通过网络传输到同一台机器上,然后在那台机器上对所有键相同的记录进行连接操作。

2.partitionBy()算子

from pyspark import SparkContext,SparkConf
if __name__ == '__main__':
    conf = SparkConf().setMaster("local").setAppName("word_count")
    sc=SparkContext(conf=conf)
    pair_rdd=sc.parallelize([('a',1),('b',10),('c',4),('d',7),('e',9),('f',10)])
    rdd_1=pair_rdd.partitionBy(2,partitionFunc=lambda x:ord(x)%2).persist()
    print(rdd_1.glom().collect())

结果如下:

rdd_1[[('b', 10), ('d', 7), ('f', 10)], [('a', 1), ('c', 4), ('e', 9)]]

parittionBy()只能用于pairRDD,将pairRDD中的key传入到partitionFunc函数中。还需要注意的是,如果不将partitonBy()操作的结果持久化,那么后面每次用到这个RDD时都会重复地对数据进行分区操作,那样的话,partitionBy()重新分区带来的好处将会被抵消。通过这个算子可以完成python中的自定义分区,则不要向scala语言中那样麻烦(spark本身提供了HashPartitioner和 RangePartitioner)。

3.影响分区方式的操作

以下算子会为生成的结果RDD设好分区方式:

cogroup()、groupWith()、join()、leftOuterJoin()、rightOuterJoin()、groupByKey()、reduceByKey()、combineByKey()、partitionBy()、sort()、mapValues(如果父RDD有分区方式),flatMapValues(如果父RDD有分区方式),filter(如果父RDD有分区方式)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值