Scala实践:列表和案例类

时间:2015-07-10 17:45:53

标签: scala list case-class

我刚开始使用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类(我认为是部分函数?)来提高可读性。

提前感谢任何输入!

2 个答案:

答案 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)
  })