Spark RDD 转换问题

Posted

技术标签:

【中文标题】Spark RDD 转换问题【英文标题】:Spark RDD transformation issue 【发布时间】: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)

【问题讨论】:

【参考方案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,它回答了您得到空结果的原因。

【讨论】:

以上是关于Spark RDD 转换问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ipython 中将 Spark RDD 转换为 pandas 数据帧?

如何在 ipython 中将 Spark RDD 转换为 pandas 数据帧?

Spark:scala - 如何将集合从 RDD 转换为另一个 RDD

将包含 BigInt 的 RDD 转换为 Spark Dataframe

Spark:如何将具有多列的 RDD 转换为数据框

在scala中将Spark Dataframe转换为RDD