1.MapPartition:
遍历的单位是每一个partition
遍历原理:将每一个partition的数据先加载到内存,然后一条一条的遍历
MapPartition:遍历的单位是每一个partition
Map:遍历单位是每一条记录
MapPartition定义:
问题:
应用场景:将RDD的数据写入mysql orcale 应该选哪一个算子遍历RDD?
map? mapPartition
1.Map:当用map进行操作时:
出现的问题:创建数据库的连接太多
解决方案:
①.通过数据库连接池 (不可行 需要池非常大)
②.批量处理(①、批太大(sql语句拼接太长) ②、Executor中使用的是Driver端中的连接,socket类型的连接是不可以序列化的(可序列化的才能走网络传输))
③.使用mappartition算子
2.MapPartition:
当前只有一个分区,只有一个创建连接
如果有10个分区时,会有10个连接
2.MapPartitionWithIndex:
在遍历每一个Partition的时候能够拿到每一个分区的ID号,这个算子一般用于测试环境(看RDD有几个分区,每个分区映射的什么数据,可以使用这个算子)
执行代码及结果:
3.CombineByKey:
遍历原理:根据key进行遍历聚
代码及运行结果、运行过程解析:
运行过程文字解析:
1.上述代码设置了两个分区,两个分区进行解析:先把同一个分区内的数据进行分组,相同的key数据放在一组。
2.分组完成后,开始第一步(初始化函数),得到相应的形式的数据,而且初始化函数是作用在第一个数据上(例如A的 1 上)
3.初始化完成以后,进行第二步:聚合操作,聚合操作中,如果A中有三个数据如: 1~ , 2 , 3 会进行两次聚合形成: 1~ $2$3
4.每个分区数据进行聚合完毕后,会进行大聚合 得到想要的数据
问题:
1.使用combinebykey来模拟groupByKey的功能,如何实现?
rdd.combineByKey(
x=>ListBuffer[x] 初始化函数
(s:listBuffer ,i:Int)=>s+=i combine聚合函数
(s1:listBuffer,s2:listBuffer)=>s1++=s2 reduce大聚合函数
)
2.使用combinebykey来模拟reduceByKey的功能,如何实现?
x=>x
(x1:Int,x2:int)=>x1+x2
(x1:Int,x2:int)=>x1+x2