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