2015-01-08 9 views
1

我是Scala的新手,並使用Spark來處理數據。爲什麼下面的代碼無法更改categoryMap?爲什麼不能在foreach中修改地圖?

import scala.collection.mutable.LinkedHashMap 
val catFile=sc.textFile(inputFile); 
var categoryMap=LinkedHashMap[Int,Tuple2[String,Int]]() 
catFile.foreach(line => { 
    val strs=line.split("\001"); 
    categoryMap += (strs(0).toInt -> (strs(2),strs(3).toInt)); 
}) 
+1

它適用於我https://gist.github.com/alexandrnikitin/29e82b1a042895671e23 –

+0

請注意,您正在拆分一個字符串,它被解釋爲正則表達式。在字符上分割更快。如果你真的想分割正則表達式,最好先編譯它。 – AmigoNico

回答

4

這是一個不錯的做法,試圖遠離兩個可變數據結構和變量。有時他們是需要的,但大多數這種處理很容易通過鏈接集合上的轉換操作來完成。另外,.toMap可以方便地將包含Tuple2Seq轉換爲Map

這裏有一種方法(我沒有正確地測試):

val categoryMap = catFile map { _.split("\001") } map { array => 
    (array(0).toInt, (array(2), array(3).toInt)) 
} toMap 

注意,如果有相應的鍵有多個記錄,則只有最後一個將出現在生成的地圖。

編輯:我沒有真正回答你原來的問題 - 基於一個快速測試,它產生了一個類似於我上面產生的代碼的地圖。盲猜,你應該確保你的catFile實際上包含要處理的數據。

相關問題