【发布时间】:2017-10-12 11:36:27
【问题描述】:
我对 Spark 和 Scala 比较陌生,并且有 Java 背景。我在 haskell 中做过一些编程,所以对函数式编程并不完全陌生。
我正在尝试完成某种形式的嵌套 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
我的 scala 解决方案(不起作用)如下所示:
val aggregatedTransactions = joinedTransactions.map( f => {
var list = List[Any](f._2._1)
val filtered = joinedTransactions.filter(t => f._1 == t._1)
for(i <- filtered){
list ::= i._2._1
}
(f._1, list, f._2._2)
})
如果两个项目的 ._1 相等,我正在尝试将项目 _2._1 放入列表中。 我知道我不能在另一个地图功能中执行任何过滤器或地图功能。我已经读到您可以通过连接实现类似的目标,但我不知道如何将这些项目实际放入列表或任何可用作列表的结构中。
如何使用 RDD 实现这样的效果?
【问题讨论】:
-
我认为您需要更准确地说明您想要实现的目标(即我认为 Java 代码与您声明的意图不符)。首先,您为什么不使用案例类来定义您正在使用的对象?
-
如果您是第一次使用 scala,我强烈建议您花一些时间玩 scala,尤其是 scala 集合。希望这有帮助
-
我不能为此使用 scala 集合,因为集合无法序列化,因此会在 spark 系统上引发错误(由于垃圾收集器超时运行..)。这确实是我的第一次尝试。
标签: scala apache-spark rdd