Spark RDD转换问题

时间:2016-02-15 21:05:54

标签: scala apache-spark

我有这种格式的数据:

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)

2 个答案:

答案 0 :(得分:0)

我能够解决这个问题:

  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()
  }

答案 1 :(得分:0)

如下:

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

您也可以查看:Nested iteration in Scala,它解答了您获得空结果的原因。