Как игнорировать двойные кавычки при чтении CSV-файла в Spark? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть CSV-файл, например:

col1,col2,col3,col4
"A,B","C", D"

Я хочу прочитать его как фрейм данных в спарк, где значения каждого поля точно такие же, как записано в CSV (я хотел бы рассмотреть" как обычный символ и скопируйте его как любой другой символ).

Ожидаемый вывод:

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|  "A|  B"| "C"|  D"|
+----+----+----+----+

Вывод, который я получаю:

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| A,B|   C|  D"|null|
+----+----+----+----+

В pyspark я читаю так:

dfr = spark.read.format("csv").option("header", "true").option("inferSchema", "true")

Я знаю, что если я добавлю такую ​​опцию:

dfr.option("quote", "\u0000")

Я получу ожидаемый результат вВ приведенном выше примере функция char '"' теперь выполняется с помощью '\u0000', но если мой CSV-файл содержит '\u0000' char, я также получу неправильный результат.

Поэтому мой вопросis: Как отключить параметр кавычки, чтобы ни один символ не действовал как кавычка?

Мой CSV-файл может содержать любой символ, и я хочу, чтобы все символы (кроме запятых) простобыть скопированы в соответствующую ячейку фрейма данных.Интересно, есть ли способ сделать это с помощью опции escape.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Из документации для pyspark.sql.DataFrameReader.csv (выделено):

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

dfr = spark.read.csv(
    path="path/to/some/file.csv",
    header="true",
    inferSchema="true",
    quote=""
)
dfr.show()
#+----+----+----+----+
#|col1|col2|col3|col4|
#+----+----+----+----+
#|  "A|  B"| "C"|  D"|
#+----+----+----+----+
0 голосов
/ 04 февраля 2019

Это просто обходной путь, если опция, предложенная @pault, не работает -

from pyspark.sql.functions import split
df = spark.createDataFrame([('"A,B","C", D"',),('""A,"B","""C", D"D"',)], schema = ['Column'])
df.show()
+-------------------+
|             Column|
+-------------------+
|      "A,B","C", D"|
|""A,"B","""C", D"D"|
+-------------------+

for i in list(range(4)):
    df = df.withColumn('Col'+str(i),split(df.Column, ',')[i])
df = df.drop('Column')
df.show()
+----+----+-----+-----+
|Col0|Col1| Col2| Col3|
+----+----+-----+-----+
|  "A|  B"|  "C"|   D"|
| ""A| "B"|"""C"| D"D"|
+----+----+-----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...