从scala(Spark)中的CSV文件中提取特定列

时间:2016-03-21 11:36:30

标签: scala csv

我有csv文件,如:

enter image description here

我想只提取专栏"摘要"超出上述文件。

我写了代码:

Dim newText = text.Replace("UserName = Unnamed", "UserName = " & TextBox_NewUser.Text)

但是这给出了输出:

enter image description here

许多"数组()"来了。我只想要该列的值"摘要",中间没有空白数组。

5 个答案:

答案 0 :(得分:2)

如果您只想要摘要部分而没有中间数组,而只需要一个平面序列,请使用flatMap

val summaries = file.flatMap(_.split(',')(3))

但是看一下CSV,你可能想要检索某种标识符,所以也许Tuple2[String, String]会更好:

val idToSummary = file.map(line => {
  val lines = line.split(',')
  (lines(2), lines(3))
})

答案 1 :(得分:1)

我建议使用专用的CSV库,因为CSV格式有许多令人惊讶的边缘情况,简单的“逐行读取,拆分”不会处理。

有各种高质量的CSV库 - scala-csv,purecsv,jackson-csv ......我将推荐kantan.csv,因为我是作者,觉得这是一个不错的选择,但我欣然承认有偏见。

无论如何,假设你的类路径中有kantan.csv库,这里是如何做到的(假设contentjava.io.File):

import kantan.csv.ops._

content.asUnsafeCsvReader[List[String]](',', true).collect {
  case _ :: _ :: s :: _ => s
}

这会将您的文件转换为CSV行上的迭代器,其中每一行都表示为List[String],然后将每行映射到其第三列的值(不包含三列或更多列的行)被忽略了。)

答案 2 :(得分:0)

val tmp1 = read_file2.map(_.split(",")).map( p=>p(3)).take(100).foreach(println)

对第一个字段使用p(0),对第四个字段使用p(3)等。

答案 3 :(得分:0)

如果文件不大,可以将其加载到内存中:

val tmp1 = file.map { line => line.split(',')(3) }

或者更简洁一点:

val tmp1 = file.map(_.split(',')(3))

答案 4 :(得分:0)

您可以使用:

val read_file2 = sc.textFile("path")

read_file2.map(_.split(",")(3)).collect

如果要根据列名获取列值,可以使用spark-csv databricks库

val df=sqlContext.read.format("csv").option("header","true").load("pathToCSv")
df.select("columnName").collect() // here Summary