mapPartitions 与 map 的区别
与 map 方法类似,map 是对 rdd 中的每一个元素进行操作,而 mapPartitions(foreachPartition) 则是对 rdd 中的每个分区的迭代器进行操作。如果在 map 过程中需要频繁创建额外的对象,例如将 rdd 中的数据通过 JDBC 连接写入数据库,map 需要为每个元素创建一个 Connection 链接,开销很大;而 mapPartition 为每个 partition 创建一个 Connection 链接。因此,mapPartitions 效率比 map 高的多。
SparkSql 或 DataFrame 默认会对程序进行 mapPartition 的优化。
foreachPartition和mapPartitions的分别
通过查看 foreachPartition 的源码发现返回值是空,可以看出 foreachPartition 应该属于 Action 运算操作,而 mapPartitions 是转化操作,此外在应用场景上区别是 mapPartitions 可以获取返回值,继续在返回 RDD 上做其他的操作,而 foreachPartition 因为没有返回值并且是 Action 操作,所以使用它一般都是在程序末尾,如:要落地数据到存储系统中如 MySQL,ES,或者 HBase 中,可以用它。
在 Transformation 中也可以落地数据,但是它必须依赖 Action 操作来触发它,因为 Transformation 操作是延迟执行的,如果没有任何 Action 方法来触发,那么 Transformation 操作是不会被执行的,这一点需要注意。
foreachPartition例子
mapPartitions 例子
combineByKey函数详解
计算总成绩的例子
3个重要的函数参数说明:
createCombiner: V => C ,这个函数把当前的值作为参数,此时我们可以对其做些附加操作(类型转换)并把它返回 (这一步类似于初始化操作)
mergeValue: (C, V) => C,该函数把元素V合并到之前的元素C(createCombiner)上 (这个操作在每个分区内进行)
mergeCombiners: (C, C) => C,该函数把2个元素C合并 (这个操作在不同分区间进行)
Hadoop大数据应用
你也能懂大数据
领取专属 10元无门槛券
私享最新 技术干货