2

我正在尝试使用 CSV 数据集创建 RDD。

问题是我有一列location具有(11112,222222)我不使用的结构。

因此,当我使用该map函数时,split(",")它会产生两列。

这是我的代码:

     val header = collisionsRDD.first 

     case class Collision (date:String,time:String,borogh:String,zip:String,
      onStreet:String,crossStreet:String,                                  
      offStreet:String,numPersInjured:Int,
      numPersKilled:Int,numPedesInjured:Int,numPedesKilled:Int,
      numCyclInjured:Int,numCycleKilled:Int,numMotoInjured:Int)   


     val collisionsPlat = collisionsRDD.filter(h => h != header).
                map(x => x.split(",").map(x => x.replace("\"","")))

     val collisionsCase = collisionsPlat.map(x => Collision(x(0),
                                x(1), x(2), x(3),                  
                                x(8), x(9), x(10),
                                x(11).toInt,x(12).toInt,
                                x(13).toInt,x(14).toInt,
                                x(15).toInt,x(16).toInt,
                                x(17).toInt))
     collisionsCase.take(5)                                                  

如何捕捉,该字段的内部而不将其视为 CSV 分隔符?

4

1 回答 1

1

使用spark-csv读取文件,因为它quote启用了该选项

对于 Spark 1.6:

sqlContext.read.format("com.databticks.spark.csv").load(file)

或 Spark 2:

spark.read.csv(file)

从文档:

quote: 默认情况下,引号字符是",但可以设置为任何字符。引号内的分隔符被忽略

$ cat abc.csv
a,b,c
1,"2,3,4",5
5,"7,8,9",10

scala> case class ABC (a: String, b: String, c: String)

scala> spark.read.option("header", "true").csv("abc.csv").as[ABC].show
+---+-----+---+
|  a|    b|  c|
+---+-----+---+
|  1|2,3,4|  5|
|  5|7,8,9| 10|
+---+-----+---+
于 2017-12-03T12:23:17.170 回答