我对Spark和Scala颇为陌生,并且拥有Java背景。我已经在haskell中做了一些编程,所以对函数式编程不是全新的。使用Scala中的RDD.map()执行嵌套循环
我正试图完成某种形式的嵌套for循环。我有一个RDD,我想根据RDD中的每两个元素来操作。伪码(类似Java的)应该是这样的:
// some RDD named rdd is available before this
List list = new ArrayList();
for(int i = 0; i < rdd.length; i++){
list.add(rdd.get(i)._1);
for(int j = 0; j < rdd.length; j++){
if(rdd.get(i)._1 == rdd.get(j)._1){
list.add(rdd.get(j)._1);
}
}
}
// Then now let ._1 of the rdd be this list
我的斯卡拉解决方案(即不工作)是这样的:
val aggregatedTransactions = joinedTransactions.map(f => {
var list = List[Any](f._2._1)
val filtered = joinedTransactions.filter(t => f._1 == t._1)
for(i
list ::= i._2._1
}
(f._1, list, f._2._2)
})
我试图实现把项目_2 ._1如果两项中的._1都相同,则将它们列入列表中。 我知道我不能在另一个地图功能中做任何滤镜或贴图功能。我读过你可以通过连接实现这样的事情,但是我不明白我是如何将这些项目放入列表或任何可用作列表的结构的。
你如何用RDD获得这样的效果?
+1
我认为你需要说明你想要更准确地达到什么目标(即,我不认为Java代码符合你的陈述意图)。对于初学者来说,为什么你不使用大小写类来定义你正在使用的对象呢? –
+2
如果你第一次使用scala,我会强烈建议花一些时间玩scala,尤其是scala系列。希望这有助于 –
+0
我无法使用scala集合,因为集合不能被序列化,因此会在spark系统上抛出一个错误(由于垃圾收集器超时运行..)。这确实是我的第一次尝试。 –
在具有Java背景的Spark项目中,作者尝试在Scala的RDD上实现嵌套循环,以根据RDD中的每两个元素进行操作。目标是创建一个列表,其中包含._1字段相同的元素。提供的Scala代码片段未能正确实现这一目标,因为无法在map操作内部执行filter或其他转换。讨论中提出了关于使用连接操作和避免使用不可序列化的集合的建议。
693

被折叠的 条评论
为什么被折叠?



