我刚开始使用Scala / Spark并且来自Java背景,我仍然试图围绕Scala的不变性和其他最佳实践的概念。
这是来自较大程序的一小段代码:
交叉点是RDD(Key,(String,String))
obs是(Key,(String,String))
数据只是我上面定义的一个案例类。
val intersections = map1 join map2
var listOfDatas = List[Data]()
intersections take NumOutputs foreach (obs => {
listOfDatas ::= ParseInformation(obs._1.key, obs._2._1, obs._2._2)
})
listOfDatas foreach println
这段代码可以正常运行,但是我想知道是否有更好的方法来实现这一点。我正在使用变量列表并在每次迭代时使用新列表重写它,并且我确信必须有一种更好的方法来创建一个填充了ParseInformation方法调用结果的不可变列表。另外,我记得在某处读取而不是直接访问元组值,我已经完成了,你应该在函数中使用case类(我认为是部分函数?)来提高可读性。
提前感谢任何输入!
答案 0 :(得分:4)
这可能在本地工作,但只是因为你take
在本地。它一旦分发就无法工作,因为listOfDatas
作为副本传递给每个工作者。做这个IMO的更好方法是:
val processedData = intersections map{case (key, (item1, item2)) => {
ParseInfo(key, item1, item2)
}}
processedData foreach println
新功能开发人员的注释:如果你要做的只是在可迭代(List
)中转换数据,请忘记foreach
。请改用map
,它会对每个项目运行转换,并吐出一个新的结果迭代。
答案 1 :(得分:1)
intersections
的类型是什么?看起来您可以将foreach
替换为map
:
val listOfDatas: List[Data] =
intersections take NumOutputs map (obs => {
ParseInformation(obs._1.key, obs._2._1, obs._2._2)
})