说我有一个名为1.txt和2.txt的文本文件。 1.txt包含
1,9,5
2,7,4
3,8,3
和2.txt包含
1,g,h
2,i,j
3,k,l
所以,我通过他们的钥匙加入了这两个人(第一栏):
val one = sc.textFile("1.txt").map{
line => val parts = line.split(",",-1)
(parts(0),(parts(1),parts(2)))
}
val one = sc.textFile("2.txt").map{
line => val parts = line.split(",",-1)
(parts(0),(parts(1),parts(2)))
}
现在,如果我理解正确,我就会
(1, ( (9,5), (g,h) ))
(2, ( (7,4), (i,j) ))
(3, ( (8,3), (k,l) ))
现在,假设我需要总结第二列1.txt的所有值,
我该怎么做?
如何在加入的RDD中引用2.txt的第二列(即g,i,k)?
有没有使用RDD的好教程?我是一个火花(和斯卡拉)新手。
答案 0 :(得分:3)
加入非常简单val joined = one.join(two)
(注意到您出于某种原因将RDD命名为one
,假设您打算给它们不同的名称)
tuple syntax in scala为tuple._number
,因此,如果joined
是您加入的RDD,则总结1.txt列
val sum = joined.map(_._2._1._2.toInt).reduce(_+_)
,如果这些文件真的很大,可能想要在地图中投射很长甚至是BigInt。
我会说最好的火花教程是main site,amp camp stuff,我个人喜欢查看源代码和scaladocs。对于scala“scala编程”是一个好的开始。
整个程序,稍微重写以使用更好的scala样式(免责声明,而不是scala专家)
val one = sc.textFile("1.txt").map{
_.split(",", -1) match {
case Array(a, b, c) => (a, ( b, c))
}
}
val two = sc.textFile("2.txt").map{
_.split(",", -1) match {
case Array(a, b, c) => (a, (b, c))
}
//looks like these two map functions are the same, could refactor into a lambda or non member function
}
val joined = one.join(two)
val sum = joined.map {
case (_, ((_, num2), (_, _))) => num2.toInt
}.reduce(_ + _)