有没有一种方法可以在Scala中禁止以','分隔并仅以','分隔csv文件

时间:2019-05-01 06:47:39

标签: scala apache-spark apache-spark-dataset

我正在使用scala读取一个csv文件来填充数据集,并且我面临着定界符问题,这是由于我的某些字段在其中包含','而引起的。

数据就像 A,B,C(温度,temp1,temp3),D,E

这是针对spark数据集的,在该数据集中我尝试读取文件,然后将其映射到数据集架构,但似乎不起作用。

SparkSession.read
    .option("delimiter",",")
    .option("header","true")
    .schema(schema)
    .csv(path).as[SampleSchema]

我希望它能正确定界。我已经观察到实际分隔符为',的区别,不应以','

分隔

1 个答案:

答案 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解析器功能,例如标头跳过和模式推断。