Есть ли способ запретить разделение с помощью ',' и просто разграничить файл CSV с помощью ',' в Scala - PullRequest
0 голосов
/ 01 мая 2019

Я читаю csv-файл, используя scala для заполнения набора данных, и там я сталкиваюсь с проблемой разделителя, которая возникает из-за того, что некоторые из моих полей имеют внутри них ','.

Данные похожи A, B, C (temp, temp1, temp3), D, E

Это для набора данных spark, в котором я попытался прочитать файл и затем сопоставить его со схемой набора данных, но, похоже, он не работает.

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

Я ожидаю, что он будет определен правильно. Я наблюдал разницу, где фактический разделитель равен ',', и он не должен быть разделен ','

1 Ответ

2 голосов
/ 01 мая 2019

Как уже упоминалось, кавычки должны использоваться в файлах 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, как пропуск заголовка и вывод схемы, если это необходимо.

...