12-pyspark的RDD算子注意事项总结


PySpark实战笔记系列第三篇


相近算子异同总结

相近变换算子异同

foreach和foreachPartition
  • 在应用foreachPartition操作时,定义的函数f在函数体中打印值时,需要用for x in iter进行循环。foreach操作则可直接用print(x)打印
  • 一般来说,利用foreachPartition效率比foreach要高,foreachPartitions操作是一次性处理一个partition的数据。

在这里插入图片描述

fold和reduce
  • fold函数和reduce函数功能是相同的,差别在于fold可以提供一个初始值来进行聚合
  • eg:有四个元素[1,2,3,4],reduce是直接把四个元素累加,即sum;fold则可以设定一个初始值,再进行累加,比如初始值是10,则就是10+1+2+3+4这样的累加。
coalesce和repatition
  • repartition()方法就是coalesce()方法shuffle为true的情况。

  • 如果要减少分区数量,建议采用rdd.coalesce(numPartitions, false)方法,这样可以避免shuffle导致数据混洗,从而提高计算效率!

    【备注】:在实际计算中,有时可能需要重新设置RDD的分区数量,如果要处理的数据量小,那么默认的分区可能比较多,这就可能导致计算速度比较慢(不同分区之间的任务调度时间比计算数据本身耗时),因此在计算过程中,可以设置一个比较合理的分区数,从而提高计算效率。

相近动作算子异同

cache和persist
  • rdd.cache()在RDD对象上进行缓存操作,后续的RDD操作会直接从内存中加载数据进行计算
  • 缓存操作rdd.persist(storageLevel),它可以指定存储级别storageLevel。

算子注意事项

需要注意的变换算子

  • takeSample操作:会将RDD整个加载到driver端的内存中,因此takeSample操作应用需在RDD数据不大的情况下。
  • randomSplit操作:这种随机分割在一些数据挖掘或者机器学习算法中非常有用,由于这些算法需要数据的训练集合和测试集合,因此需要把总的数据集合进行随机切分,比如70%用于训练,30%用于测试。
  • Python 3+环境下,在Spark集群上使用distinct()、reduceByKey()和join()等几个函数时,可能会触发PYTHONHASHSEED异常,即Randomness of hash of string should be disabledvia PYTHONHASHSEED,此时可以在在spark-defaults.conf设置spark.executorEnv.PYTHONHASHSEED=0。
  • cartesian操作:如果rdd1和rdd2元素个数比较多,直接进行cartesian计算可能会出现内存不足的情况。

需要注意的动作算子

  • collect操作:对于少量RDD数据的观察非常有用,海量会引起内存不足等情况。因为collect操作会将RDD数据汇总到一处,如果数据量非常大,那么可能会出现内存不足等情况,因此不适合海量数据的查看。
  • saveAsTextFile操作:数据保存当设定的目录不存在时,执行此操作则会报错。生成的数据是多个文件组成的。

参考文档:


博主写博文就是方便对自己所学所做的事做一备份记录或回顾总结。欢迎留言,沟通学习。

刚开始接触,请多指教,欢迎留言交流!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

积跬步,慕至千里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值