2015-07-10 110 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