Обработка выхода для \ r \ n в искровой CSV - PullRequest
0 голосов
/ 24 января 2019

Мой исходный файл выгружен из базы данных Amazon's RedShift. Я извлек данные с помощью команды UNLOAD. У моих данных есть столбец с текстом произвольной формы с символами новой строки Windows (\ r \ n), и он будет иметь символы кавычки (") в виде хорошо.

Но redshift предоставляет опцию только для ADDQUOTES, но не предоставляет возможность выбрать, каким может быть этот символ кавычки, и то же самое имеет место в случае ESCAPE. Их реализация добавляет escape-символ (\) перед всеми приведенными ниже символами.

  • Перевод строки: \ n
  • Возврат каретки: \ r
  • Символ разделителя, указанный для выгруженных данных. Побег символ: \
  • Символ кавычки: "или" (если указаны ESCAPE и ADDQUOTES в команде UNLOAD).

Дополнительная информация (https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html)

Из-за этого выгруженные данные имеют escape-символы перед каждым из символов новой строки Windows, таких как \\ r \\ n.

Когда я пытаюсь прочитать этот файл через spark.read.csv () с параметром escape = '\\', он не удаляет символ escape (\), который был добавлен перед \ r и \ n.

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

Я могу удалить это после прочтения в фрейм данных. Но есть ли способ удалить дополнительные escape-символы (\) в данных при чтении в фрейм данных?

Ценю вашу помощь!

Примеры записей (с escape-символами перед \ r \ n):

1,"this is \^M\
 line1"
2,"this is \^M\
 li\"ne2"
3,"this is \^M\
 line3"

Вот как в файле выгрузки красного смещения вставляются escape-символы. Перед символами кавычек, если они присутствуют как часть данных и перед каждым \ r и \ n соответственно.

Когда я читаю этот файл в фрейм данных, spark корректно удаляет escape-символы перед \ n и в кавычках ("), но сохраняет этот символ перед \ r.

>>> df2 = spark.read.csv("file:///tmp/sample_modified.csv",header=False,quote='"',sep=',',escape='\\',multiLine=True,inferSchema=False)
>>> df2.show(5,False)
+---+-------------------+
|_c0|_c1                |
+---+-------------------+
\1  |this is \
 line1 |
\2  |this is \
 li"ne2|
\3  |this is \
 line3 |
+---+-------------------+

ожидаемый результат (без escape-символа "\"):

+---+----------------+
|_c0|_c1             |
+---+----------------+
|1  |this is 
 line1|
|2  |this is 
li"ne2|
|3  |this is 
line3 |
+---+----------------+

PS - Поскольку это является ограничением, я открыл проблему JIRA в проекте Apache Spark. (https://issues.apache.org/jira/browse/SPARK-26786)

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Код ниже работает нормально.

df=df2.select(*(regexp_replace(col(c),"\\\\\r\\\\\n","\r\n").alias(c) for c in df2.columns))

>>> df.show()
+---+-----------------+
|_c0|              _c1|
+---+-----------------+
|  1| this is line1   |
|  2| this is li"ne2  |
|  3| this is li\ne3  |
+---+-----------------+
0 голосов
/ 24 января 2019

Попробуйте это ..

Вот так выглядит файл в cygwin

$ cat -vT vishsnu.csv
"ID","Desc"
1001,"this ^M
 is line1"
1002,"this ^M
 is line2"
1003,"this ^M
 is line3"
$

Искровой код

val df = spark.read.format("csv")
            .option("wholeFile", "true")
  .option("multiLine","true")
            .option("inferSchema","true")
            .option("header","true")
           // .option("escape","""\""")  this is commented
            .load("in_201901/vishsnu.csv")

df.show(false)
df.select("desc").show(false)
println("Count of dataframe records " + df.count)

Результаты:

+----+---------------+
|ID  |Desc           |
+----+---------------+
|1001|this 
 is line1|
|1002|this 
 is line2|
|1003|this 
 is line3|
+----+---------------+

+---------------+
|desc           |
+---------------+
|this 
 is line1|
|this 
 is line2|
|this 
 is line3|
+---------------+

Count of dataframe records 3

Функции regex_replace не помогли удалить символы \ r \ n.Но функция перевода сделала.См. Ниже

  df.withColumn("desc2",translate(translate('desc,"\r",""),"\n", "")).select('id,'desc2).show(false)

Результаты

+----+--------------+
|id  |desc2         |
+----+--------------+
|1001|this  is line1|
|1002|this  is line2|
|1003|this  is line3|
+----+--------------+
...