У меня есть фрейм данных, который содержит двойную кавычку ("") и запятую в значении. Я пытаюсь экспортировать фрейм данных в CSV, но, к сожалению, двойная кавычка не отображается должным образом в экспортированном CSV.
Мне удалось обработать все другие специальные символы, установив для «quoteAll» значение true.
В csv, если вы замените одинарную двойную кавычку двумя двойными кавычками, все будет работать нормально. Но когда я экспортирую в csv код ниже, он заменяет «на» в экспортированном csv.
%scala
import org.apache.spark.sql.functions.regexp_replace
val df = Seq((1, "A,B,C,\"DEF\""), (2, "DEF")).toDF("ID", "Val")
val updatedDf = df.columns.foldLeft(df)((acc, colname) => acc.withColumn(colname,regexp_replace(acc(s"`$colname`"), "\"", "\"\"")))
deltaDS.coalesce(1).write
.option("header", true)
.option("encoding", "utf-8")
.option("quoteAll", true)
.mode("Overwrite").csv("[Location to store csv]")
Вывод:
Ожидаемый результат:
Как я могу справиться с этим?
Судя по вводу, следующие данные, по-видимому, являются выходными данными.
ДФ:
ОбновленДФ:
Поскольку для параметра quoteAll установлено значение true, он будет работать, как указано в документации по искре.
При преобразовании в CSV вывод выглядит следующим образом.
Дф.csv:
"ID","Val"
"1","A,B,C,\"DEF\""
"2","DEF"
Обновленный файл DF.csv:
"ID","Val"
"1","A,B,C,\"\"DEF\"\""
"2","DEF"
Одно из предложений по работе с escape-символом - использовать исходный фрейм данных и сделать escape-символ пустым. Но, пожалуйста, будьте осторожны с тем, как это может повлиять на другие специальные символы.
%scala
df.coalesce(1).write
.option("header", true)
.option("encoding", "utf-8")
.option("quoteAll", true)
.option("escape", "")
.mode("Overwrite").csv("<path>/tst_1dq_noesc.csv")
"ID","Val"
"1","A,B,C,"DEF""
"2","DEF"
Надеюсь, это ожидаемый результат...
Не могу пустой побег. У меня также есть новые линейные символы. \n\r и т.д...
Вы не предоставили точный открытый текст csv, который вы ожидаете, поэтому трудно догадаться. Вы ищете это?
val df = Seq((1, "A,B,C,\"DEF\""), (2, "DEF")).toDF("ID", "Val")
df.coalesce(1).write
.option("header", true)
.option("encoding", "utf-8")
.option("quoteAll", true)
.option("escape", "\"") // escapes quotes inside quote using "
.mode("Overwrite").csv("xxx")
Результирующий CSV:
"ID","Val"
"1","A,B,C,""DEF"""
"2","DEF"
Это сработало. Мне не хватало .option("escape", "\"") Огромное спасибо.
Может быть, charToEscapeQuoteEscaping из Spark - Документация CSV может помочь? Пожалуйста, взгляните также на escape и escapeQuotes, так как они, кажется, работают вместе.