【问题标题】:How to read from csv to a ListMap如何从 csv 读取到 ListMap
【发布时间】:2017-11-10 11:27:15
【问题描述】:

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

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

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

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

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

我一直在阅读,但我不太了解this answer 也不是this one

【问题讨论】:

  • 你的 csv 文件是用空格分隔的吗?
  • 它由“,”分隔,我的意思是,每一行,字段由“,”字符分隔。每行以“\n”结束
  • 我在您的问题中对输入 csv 数据的编辑是否正确?如果是,您的数据中是否有“(反逗号)?
  • 如果可能的话,你能分享你的代码吗?
  • 是的,有逗号。有时字符串是字符串,有时它们有逗号。我正在尝试展示一些代码,但由于我经常更改它以尝试不同的案例并与队友合作,我担心我现在没有值得展示的东西:S

标签: scala list apache-spark


【解决方案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
  }

【讨论】:

  • 我最终使用了这两个答案,它们都非常有帮助。关于如何反映这一点的任何建议?我猜有一个meta post谈论这个问题,总是有哈哈
【解决方案2】:

Array("foo" -&gt; "bar", "baz" -&gt; "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

【讨论】:

  • 哇哦,这就是breakOut。顺便说一句,我也不知道。我希望有一天有时间向我解释它......更重要的是,我想说我很遗憾地写错了这个问题。当我阅读 csv 时,我得到的是 RDD[(String,String)]。在这一点上,我的想法是收集所说的 RDD,得到一个数组,然后能够做你教我的事情。但是我有这种感觉,这一切都是错误的(就我而言)。
  • 这不是“错误的”(可能除了首先使用 spark 的部分),只要它适合内存。如果你想最终得到一个Map,最好这样做:)
  • 所以 Spark 是错误的工具,对吧?前几天我只是在谈论这个。我认为 Hive 或 Impala 会更有意义。由于它是一个文件,我们可以直接存储在 hdfs 中。对于与此类似的问题,还有哪些其他选择可以推荐?是的,感谢有关内存和地图问题的警告。我之前确实看过它,现在似乎是少量信息,因为我很担心做collect()
  • 您也不需要配置单元(甚至 hdfs)。只需将文件放到磁盘上,然后直接读取即可。
  • Source.fromFile("filename.csv").getLines
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 2013-06-13
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多