加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

如何实现两个rdd之间的数学运算

(2016-01-28 11:31:10)
标签:

rdd

分类: scala学习
主要思想是通过tuple,k-v对,将两个rdd转换成为一个rdd,然后转变成一个rdd不同位之间的数学操作。

val data=sc.textFile("file:///home/yqm/111.txt").map(_.split(",")).filter(_.length==2).map(a=>(a(1)))map(_.toInt)
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))
同样的方法。注意,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)))
 Array[Int] = Array(-10, -332, -10, -355, -98, -334, -66, -556, 10, 355, 98, 334, 76, 888)
可以进行相关数学运算。注意需要先加入math包。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有