2015-07-10 107 views
0

我刚刚开始使用Scala/Spark,并且来自Java背景,我仍然试图围绕着不变性和Scala其他最佳实践的概念。Scala实践:列表和案例类

这是代码从较大的程序的非常小的段:
交点被RDD(密钥,(字符串,字符串))
OBS是(密钥,(字符串,字符串))
数据仅仅是一个我上面定义的案例类。

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类(作为我认为的部分函数?)以提高可读性。

在此先感谢您的任何意见!

回答

4

这可能在本地工作,但只是因为你是take本地荷兰国际集团。由于listOfDatas作为副本传递给每个工作人员,因此一旦分发就无法工作。这样做IMO的更好的方法是:

val processedData = intersections map{case (key, (item1, item2)) => { 
    ParseInfo(key, item1, item2) 
}} 

processedData foreach println 

一个新的功能性开发的说明:如果你正在尝试做的是一个可迭代(List)转换数据,忘记foreach。改为使用map,它会在每个项目上运行您的转换,并分析结果的新迭代。

1

什么是intersections的类型?它看起来像你可以map替代foreach

val listOfDatas: List[Data] = 
    intersections take NumOutputs map (obs => { 
    ParseInformation(obs._1.key, obs._2._1, obs._2._2) 
    }) 
+0

哦,贾斯廷皮胡尼的回答比我的好。 – earldouglas