如何实现两个rdd之间的数学运算
(2016-01-28 11:31:10)
标签:
rdd |
分类: scala学习 |
主要思想是通过tuple,k-v对,将两个rdd转换成为一个rdd,然后转变成一个rdd不同位之间的数学操作。
res47: Array[Int] = Array(11, 333, 11, 356, 99, 335, 77, 889)
将111txt数据载入并以rdd形式分布。注意,将rdd转化为int型。
val a=Array(1,1,1,1,1,1)
val add=sc.parallelize(a)
res:Array[Int] = Array(1, 1, 1, 1, 1, 1)
构建了int型的rdd序列。
val dataold=data.union(add)
res50: Array[Int] = Array(11, 333, 11, 356, 99, 335, 77, 889, 1, 1, 1, 1, 1, 1)
union将两个rdd顺次连接。
同样可以得到相同长度的datanew。
val dataoldc=dataold.zipWithIndex.map(a=>(a._2,a._1))
res51: Array[(Long, Int)] = Array((0,11), (1,333), (2,11), (3,356), (4,99), (5,335), (6,77), (7,889), (8,1), (9,1), (10,1), (11,1), (12,1), (13,1))
加入index,让两个rdd有相同的k,用于组合。
val datanew=add.union(data)
val datanewc=datanew.zipWithIndex.map(a=>(a._2,a._1))
res52: Array[(Long, Int)] = Array((0,1), (1,1), (2,1), (3,1), (4,1), (5,1), (6,11), (7,333), (8,11), (9,356), (10,99), (11,335), (12,77), (13,889))
val dataoldc=dataold.zipWithIndex.map(a=>(a._2,a._1))
res51: Array[(Long, Int)] = Array((0,11), (1,333), (2,11), (3,356), (4,99), (5,335), (6,77), (7,889), (8,1), (9,1), (10,1), (11,1), (12,1), (13,1))
加入index,让两个rdd有相同的k,用于组合。
val datanew=add.union(data)
val datanewc=datanew.zipWithIndex.map(a=>(a._2,a._1))
res52: Array[(Long, Int)] = Array((0,1), (1,1), (2,1), (3,1), (4,1), (5,1), (6,11), (7,333), (8,11), (9,356), (10,99), (11,335), (12,77), (13,889))
同样的方法。注意,map(a=>(a._2,a._1)),将index放到第一列,作为k,剩下的第二列的值为v。
val dataall=dataoldc.join(datanewc).sortByKey()
res53: Array[(Long, (Int, Int))] = Array((0,(11,1)), (1,(333,1)), (2,(11,1)), (3,(356,1)), (4,(99,1)), (5,(335,1)), (6,(77,11)), (7,(889,333)), (8,(1,11)), (9,(1,356)), (10,(1,99)), (11,(1,335)), (12,(1,77)), (13,(1,889)))
join命令完成两个rdd变一个rdd的关键步骤。
import scala.math._
val result=dataall.map(a=>((a._2._2)-(a._2._1)))
可以进行相关数学运算。注意需要先加入math包。

加载中…