Spark не может прочитать CSV, когда имя последнего столбца содержит пробелы - PullRequest
0 голосов
/ 23 мая 2018

У меня есть CSV, который выглядит следующим образом:

+-----------------+-----------------+-----------------+
| Column One      | Column Two      | Column Three    |
+-----------------+-----------------+-----------------+
| This is a value | This is a value | This is a value |
+-----------------+-----------------+-----------------+
| This is a value | This is a value | This is a value |
+-----------------+-----------------+-----------------+
| This is a value | This is a value | This is a value |
+-----------------+-----------------+-----------------+

В простом тексте он на самом деле выглядит так:

Column One,Column Two,Column Three
This is a value,This is a value,This is a value
This is a value,This is a value,This is a value
This is a value,This is a value,This is a value

Мой метод spark.read выглядит следующим образом:

val df = spark.read
    .format("csv")
    .schema(schema)
    .option("quote", "\"")
    .option("escape", "\"")
    .option("header", "true")
    .option("multiLine", "true")
    .option("mode", "DROPMALFORMED")
    .load(inputFilePath)

Когда для multiLine установлено значение true, df загружается как пустое.Он отлично загружается, когда multiLine установлен на false, но мне нужно multiLine установить на true.

Если я изменю имя Column Three на ColumnThree, а также обновлю этов объекте schema он работает нормально.Похоже, multiLine применяется к строке заголовка!Я надеялся, что это не тот случай, когда header также установлен на true.

Есть идеи, как обойти это?Должен ли я использовать парсер univocity вместо стандартного commons?

ОБНОВЛЕНИЕ:

Я не знаю, почему эти смоделированные данные работали нормально.Вот более близкое представление данных:

CSV (Всего 1 заголовок и 1 строка данных ...):

Digital ISBN,Print ISBN,Title,Price,File Name,Description,Book Cover File Name
97803453308,test,This is English,29.99,qwe_1.txt,test,test

Схема и метод spark.read:

val df = spark.read
  .format("csv")
  .schema(StructType(Array(
    StructField("Digital ISBN", StringType, true),
    StructField("Print ISBN", StringType, true),
    StructField("Title", StringType, true),
    StructField("File Name", StringType, true),
    StructField("Price", StringType, true),
    StructField("Description", StringType, true),
    StructField("Book Cover File Name", StringType, true)
  )))
  .option("quote", "\"")
  .option("escape", "\"")
  .option("header", "true")
  .option("multiLine", "true")
  .option("mode", "DROPMALFORMED")
  .load(inputFilePath)

df.show() результат spark-shell:

+------------+----------+-----+---------+-----+-----------+--------------------+
|Digital ISBN|Print ISBN|Title|File Name|Price|Description|Book Cover File Name|
+------------+----------+-----+---------+-----+-----------+--------------------+
+------------+----------+-----+---------+-----+-----------+--------------------+

UDPATE 2:

Мне кажется, я нашел "что-то другое".Когда я копирую данные в CSV и сохраняю их в другой CSV, все работает нормально.Но тот оригинальный CSV (который был сохранен в Excel) не работает ... CSV, сохраненный в Excel, составляет 1290 байт, в то время как созданный мной CSV (который работает нормально) составляет 1292 байта ....

ОБНОВЛЕНИЕ3:

Я открыл два файла, упомянутых в Update2 в vim, и заметил, что CSV, сохраненный в Excel, имел ^M вместо новых строк.Все мои тесты до этого были ошибочными, потому что они всегда сравнивали CSV, изначально сохраненный в Excel, с CSV, созданным из Sublime ... Sublime не показывал разницу.Я уверен, что есть настройка или пакет, который я могу установить, чтобы увидеть это, потому что я использую Sublime в качестве моего одноразового редактора файлов ...

Не уверен, должен ли я закрыть этот вопрос, так как заголовоквводит в заблуждение.Опять же, там должно быть какое-то значение для кого-то там, лол ...

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Поскольку у вопроса есть несколько голосов "против", вот решение исходной проблемы в качестве ответа ...

Новые строки в файлах, сохраненных в мире Windows, содержат как carriage return, так и line feed.Spark (работает в Linux) видит это как искаженную строку и отбрасывает ее, потому что в ее мире новые строки - это просто line feed.

Уроки:

  • Важно быть знакомымс источником файла, с которым вы работаете.
  • При отладке проблем с обработкой данных работайте с редактором, который показывает возврат каретки.
0 голосов
/ 29 октября 2018

Я столкнулся с той же проблемой, когда к заголовку был применен параметр multiLine.Я решил это, добавив дополнительную опцию игнорирования конечных пробелов.

  .option("header", true)
  .option("multiLine", true)
  .option("ignoreTrailingWhiteSpace", true)
...