【问题标题】:Spark RDD transformation issueSpark RDD 转换问题
【发布时间】:2016-02-15 21:05:54
【问题描述】:

我有这种格式的数据:

100 1 2 3 4 5

我使用下面的代码来加载它:

 val data : RDD[(String, Array[Int])] = sc.textFile("data.txt").map(line => ((line.split("\t"))(0), (line.split("\t"))(1).split(" ").map(_.toInt)))

我想从 Array[Int] 生成对,使得值大于数字(以下代码中为 2)的数组元素与数组的所有其他元素配对。然后,我将使用它来生成更多统计信息。例如,使用示例数据,我应该能够首先生成:

100 (3,1), (3,2), (3,4), (3,5),(4,1), (4,2), (4,3), (4,5 )

val test = merged_data.mapValues { case x =>
      for (element <- x) {
        val y = x.filter(_ != element)

        if (element > 2)
          {

            for (yelement <- y)
              {
                (element, yelement)
              }
          }
      }
      }

这是我得到的 o/p: Array[(String, Unit)] = Array((100,())) 不知道为什么它是空的。

一旦我能够解决这个问题,我将对元组中的元素进行排序并删除重复项(如果有的话) 上面的o/p

100 (3,1), (3,2), (3,4), (3,5),(4,1), (4,2), (4,3), (4,5 )

变成这样:

100 (1,3), (2,3), (3,4), (3,5), (1,4), (2,4), (4,5)

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    我能够解决这个问题:

      val test = merged_data.mapValues { case x =>
      var sb = new StringBuilder
    
      for (element <- x) {
        val y = x.filter(_ != element)
    
        if (element > 2)
          {
    
            for (yelement <- y)
              {
                (element, yelement)
              }
          }
      }
      sb.toString()
      }
    

    【讨论】:

    • 你没有对那个 StringBuilder 做任何事情?
    【解决方案2】:

    比如:

    val test = data.mapValues { x =>
        for {
            element <- x.filter(_ > 2);
            yelement <- x.filter(_ != element)
        } yield (element, yelement)
    }
    

    您可能还想查看:Nested iteration in Scala,它回答了您得到空结果的原因。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 2016-06-23
      • 2017-07-02
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多