我對Spark和Scala頗爲陌生,並且擁有Java背景。我已經在haskell中做了一些編程,所以對函數式編程不是全新的。使用Scala中的RDD.map()執行嵌套循環
我正試圖完成某種形式的嵌套for循環。我有一個RDD,我想根據RDD中的每兩個元素來操作。僞碼(類似Java的)應該是這樣的:
// some RDD named rdd is available before this
List list = new ArrayList();
for(int i = 0; i < rdd.length; i++){
list.add(rdd.get(i)._1);
for(int j = 0; j < rdd.length; j++){
if(rdd.get(i)._1 == rdd.get(j)._1){
list.add(rdd.get(j)._1);
}
}
}
// Then now let ._1 of the rdd be this list
我的斯卡拉解決方案(即不工作)是這樣的:
val aggregatedTransactions = joinedTransactions.map(f => {
var list = List[Any](f._2._1)
val filtered = joinedTransactions.filter(t => f._1 == t._1)
for(i <- filtered){
list ::= i._2._1
}
(f._1, list, f._2._2)
})
我試圖實現把項目_2 ._1如果兩項中的._1都相同,則將它們列入列表中。 我知道我不能在另一個地圖功能中做任何濾鏡或貼圖功能。我讀過你可以通過連接實現這樣的事情,但是我不明白我是如何將這些項目放入列表或任何可用作列表的結構的。
你如何用RDD獲得這樣的效果?
我認爲你需要說明你想要更準確地達到什麼目標(即,我不認爲Java代碼符合你的陳述意圖)。對於初學者來說,爲什麼你不使用大小寫類來定義你正在使用的對象呢? – josephpconley
如果你第一次使用scala,我會強烈建議花一些時間玩scala,尤其是scala系列。希望這有助於 – Pavel
我無法使用scala集合,因爲集合不能被序列化,因此會在spark系統上拋出一個錯誤(由於垃圾收集器超時運行..)。這確實是我的第一次嘗試。 –