我正在使用scala读取一个csv文件来填充数据集,并且我面临着定界符问题,这是由于我的某些字段在其中包含','而引起的。
数据就像 A,B,C(温度,temp1,temp3),D,E
这是针对spark数据集的,在该数据集中我尝试读取文件,然后将其映射到数据集架构,但似乎不起作用。
SparkSession.read
.option("delimiter",",")
.option("header","true")
.schema(schema)
.csv(path).as[SampleSchema]
我希望它能正确定界。我已经观察到实际分隔符为',的区别,不应以','
分隔答案 0 :(得分:2)
如前所述,在CSV文件中应使用引号。如果这不是一个选择,则可以通过使用负的超前正则表达式来实现。给定CSV文件
h1,h2,h3,h4,h5
A,B,C(temp, temp1, temp3),D,E
A,B,C,D,E
并假设文件中不包含|
(可以使用任何字符)
val txt = spark.read
.textFile(path)
.map(_.replaceAll(",(?!\\s)", "|"))
spark.read
.option("delimiter", "|")
.option("header", "true")
.csv(txt)
.show(20, false)
输出:
+---+---+---------------------+---+---+
|h1 |h2 |h3 |h4 |h5 |
+---+---+---------------------+---+---+
|A |B |C(temp, temp1, temp3)|D |E |
|A |B |C |D |E |
+---+---+---------------------+---+---+
因此,如果需要,我们仍然可以受益于CSV解析器功能,例如标头跳过和模式推断。