为什么不能在foreach中修改地图?

时间:2015-01-08 06:42:07

标签: scala apache-spark

我是Scala的新手并使用Spark来处理数据。为什么以下代码无法更改categoryMap?

 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 个答案:

答案 0 :(得分:4)

尝试远离可变数据结构和变量是一种很好的做法。有时它们是必需的,但通过链接转换操作很容易实现这种处理。此外,.toMap可以将包含Seq的{​​{1}}转换为Tuple2

这是一种方式(我没有正确测试):

Map

请注意,如果有一个以上的记录对应一个键,那么结果映射中只会出现最后一个记录。

编辑:我实际上没有回答您的原始问题 - 基于快速测试,它会产生与我上面的代码产生的类似的地图。盲目猜测,你应该确保你的val categoryMap = catFile map { _.split("\001") } map { array => (array(0).toInt, (array(2), array(3).toInt)) } toMap 实际上包含要处理的数据。