【问题标题】:how to work with joined RDD如何使用加入的 RDD
【发布时间】:2014-08-29 21:39:39
【问题描述】:

假设我有一个名为 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. 如何在joined RDD中引用2.txt的第二列(即g,i,k)?

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

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:
    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(_+_) ,如果这些文件非常大,可能需要在地图中转换为 long 甚至 BigInt。

    3. 我会说最好的 spark 教程是他们的 main siteamp 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(_ + _)
    

    【讨论】:

    • map(_._2._1._2.toInt) 的一个更易读的替代方案是map { case (id, ((num1, num2), (str1, str2))) => num2.toInt }
    • 你的风格几乎完美......只要你有单行 lambda,你应该使用 (),@DanielDarabos 的建议会让事情变得更易读。最后,您应该在逗号之后和运算符之间放置空格。 ...我会尝试编辑您的答案
    • 哦,+1 记得在你的拆分中使用 -1 - 难以置信有多少人忘记了这一点!
    • @DanielDarabos 采纳了您的建议
    • @samthebest 你的大部分编辑都是次要的,但下次我将在提交之前通过 scalastyle 运行我的程序:)。除了你删除了我的免责声明,我不能让人认为我是 scala 专家
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2021-06-05
    • 2017-05-23
    • 2023-03-13
    • 2018-08-06
    • 1970-01-01
    • 2021-09-08
    • 2015-09-10
    相关资源
    最近更新 更多