如何从csv读取到ListMap

时间:2017-11-10 11:27:15

标签: scala list apache-spark

我被分配了从csv读取和创建ListMap变量的任务。使用这个特定类的原因是,对于其他一些用例,他们已经使用了ListMap作为输入参数的许多方法,他们又需要一个。

到目前为止我所做的是:从csv中读取,然后创建一个rdd。 csv的格式是

"field1,field2"
"value1,value2"
"value3,value4"

在这个rdd中我有字符串元组。我想要的是现在将其转换为ListMap类。所以我所拥有的是一个类型为 Array [(value1,value2),(value3,value4)] 的变量。

我这样做是因为我觉得从csv到元组很容易。问题是我找不到任何方法从这里到ListMap。获得一个普通的Map类似乎更容易,但正如我所说,最终结果必须是ListMap类型的对象。

我一直在阅读,但我并不理解this answerthis one

2 个答案:

答案 0 :(得分:1)

Array("foo" -> "bar", "baz" -> "bat").toMap为您提供Map。 如果您正在寻找一个ListMap专门(对于我的生活,想不出你为什么会这样做),那么你需要一个breakOut

 val map: ListMap[String, String] = 
    Array("foo" -> "bar", "baz" -> "bat")
     .toMap
     .map(identity)(scala.collection.breakOut)

breakOut是一种“集合工厂”,可让您隐式转换不同的集合类型。您可以在此处详细了解:https://docs.scala-lang.org/tutorials/FAQ/breakout.html

答案 1 :(得分:1)

根据您提供的示例数据,您可以使用collectAsMap api获取最终ListMap

val rdd  = sparkSession.sparkContext.textFile("path to the text file")
  .map(line => line.split(","))
  .map(array => array(0) -> array(1))
  .collectAsMap()

多数民众赞成。

现在,如果您想更进一步,可以采取其他措施

  var listMap : ListMap[String, String] = ListMap.empty[String, String]
  for(map <- rdd) {
    listMap += map
  }