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