如何使用加入的RDD

时间:2014-07-09 01:05:49

标签: scala apache-spark rdd

说我有一个名为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的所有值,

  1. 我该怎么做?

  2. 如何在加入的RDD中引用2.txt的第二列(即g,i,k)?

  3. 有没有使用RDD的好教程?我是一个火花(和斯卡拉)新手。

1 个答案:

答案 0 :(得分:3)

  1. 加入非常简单val joined = one.join(two)(注意到您出于某种原因将RDD命名为one,假设您打算给它们不同的名称)

  2. tuple syntax in scalatuple._number,因此,如果joined是您加入的RDD,则总结1.txt列 val sum = joined.map(_._2._1._2.toInt).reduce(_+_),如果这些文件真的很大,可能想要在地图中投射很长甚至是BigInt。

  3. 我会说最好的火花教程是main siteamp camp stuff,我个人喜欢查看源代码和scaladocs。对于scala“scala编程”是一个好的开始。

  4. 整个程序,稍微重写以使用更好的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(_ + _)