我刚刚开始使用Scala/Spark,并且来自Java背景,我仍然试图了解Scala的不可变概念和其他最佳实践。
这是一个来自较大程序的非常小的代码段:
交叉口是RDD(键,(字符串,字符串))
是(键,(串,串))
数据只是我前面定义的一个案例类。
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类(我认为它是部分函数?)提高可读性。
谢谢您的任何意见!
发布于 2015-07-10 17:53:03
这可能在本地起作用,但仅仅是因为您是在本地进行take。当listOfDatas作为副本传递给每个工作人员时,它将不再工作。海事组织这样做的更好办法是:
val processedData = intersections map{case (key, (item1, item2)) => {
ParseInfo(key, item1, item2)
}}
processedData foreach println对于一个新的函数式开发工具,请注意:如果您所要做的只是在可迭代(List)中转换数据,那么忘记foreach。相反,使用map,它运行对每个项的转换,并输出一个新的可迭代结果。
发布于 2015-07-10 17:51:42
intersections的类型是什么?看起来您可以用foreach替换map
val listOfDatas: List[Data] =
intersections take NumOutputs map (obs => {
ParseInformation(obs._1.key, obs._2._1, obs._2._2)
})https://stackoverflow.com/questions/31347120
复制相似问题