Мой исходный файл выгружен из базы данных 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)