[Spark精进]必须掌握的4个RDD算子之mapPartitions算子
2023-04-18 12:41:39 时间
第二个mapPartitions:以数据分区为粒度的数据转换
按照介绍算子的惯例,我们还是先来说说 mapPartitions 的用法。mapPartitions,顾名思义,就是以数据分区为粒度,使用映射函数 f 对 RDD 进行数据转换。对于上述单词哈希值计数的例子,我们结合后面的代码,来看看如何使用 mapPartitions 来改善执行性能:
// 把普通RDD转换为Paired RDD
import java.security.MessageDigest
val cleanWordRDD: RDD[String] = _ // 请参考第一讲获取完整代码
val kvRDD: RDD[(String, Int)] = cleanWordRDD.mapPartitions( partition => {
// 注意!这里是以数据分区为粒度,获取MD5对象实例
val md5 = MessageDigest.getInstance("MD5")
val newPartition = partition.map( word => {
// 在处理每一条数据记录的时候,可以复用同一个Partition内的MD5对象
md5.digest(word.getBytes).mkString
})
newPartition
})
可以看到,在上面的改进代码中,mapPartitions 以数据分区(匿名函数的形参 partition)为粒度,对 RDD 进行数据转换。具体的数据处理逻辑,则由代表数据分区的形参 partition 进一步调用 map(f) 来完成。你可能会说:“partition. map(f) 仍然是以元素为粒度做映射呀!这和前一个版本的实现,有什么本质上的区别呢?” 仔细观察,你就会发现,相比前一个版本,我们把实例化 MD5 对象的语句挪到了 map 算子之外。如此一来,以数据分区为单位,实例化对象的操作只需要执行一次,而同一个数据分区中所有的数据记录,都可以共享该 MD5 对象,从而完成单词到哈希值的转换。 通过下图的直观对比,你会发现,以数据分区为单位,mapPartitions 只需实例化一次 MD5 对象,而 map 算子却需要实例化多次,具体的次数则由分区内数据记录的数量来决定。
相关文章
- 【.net 深呼吸】连接Access数据库应注意的几点
- 【Win 10 应用开发】Sqlite 数据库的简单用法
- 【Win 10 应用开发】通过数据绑定更新进度条
- 【Win 10 应用开发】UDP广播
- 【Win 10应用开发】延迟共享
- 【Win 10 应用开发】共享目标(UWP)
- 金融/语音/音频处理学术速递[11.24]
- 计算照片的面积(UWP篇)
- 【Win 10应用开发】分阶段进行数据绑定
- 【Win10 应用开发】实现数据的增量加载
- Mysql基础入门知识点总结笔记
- TCP/IP四层模型对比OSI七层网络模型的区别是啥?数据传输过程原来是这样的!
- 【Win10应用开发】签名与验证
- BT × IT | 如何利用神经网络做空间转录组分析?
- DSTG:基于图形的卷积网络对空间转录组数据进行去卷积
- 【WP开发】JSON数据的读与写
- 【WP8.1开发】RenderTargetBitmap类的特殊用途
- 【WP 8.1开发】How to 图像处理
- 【WP 8.1开发】如何动态生成Gif动画
- 各种癌症都有自己的细分亚型(数据挖掘可以更进一步)