在Spark中读取csv时防止分隔符冲突

时间:2017-12-03 12:09:31

标签: scala apache-spark spark-dataframe rdd spark-csv

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

问题是我有一个const product : Produce = { $key: "", title: "",price:0,restuarant :"" ,imageurl:"" }; 列,其结构类似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分隔符?

1 个答案:

答案 0 :(得分: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|
+---+-----+---+