У меня есть искра, которая обрабатывает несколько сжатых файлов. Файлы имеют кодировку Windows 1252, и каждая строка заканчивается на CRLF
(т.е. \u000d\u000a
).
Я использую следующий код для загрузки файлов в DataFrames
hdfs
.globStatus(pathPattern)
.filter(f => f.isFile)
.map{f => f.getPath.getName -> spark
.read
.option("delimiter", "\u000A")
.option("encoding", "Windows-1252")
.csv(f.getPath.toString)
.map(r => r.getString(0))
}
Данные представлены в формате фиксированной ширины, поэтому я ожидаю длину строки x и извлекаю различные подстроки в диапазоне 0..x-1
После обработки различных файлов я обнаружил, что очень редко встречается символ CR
внутри строки. Как следствие, длина строки меньше x, и я отклоняю ее.
Установка .option("multiLine", "true")
не решает проблему.
Замена символа CR
на '' решит проблему, и я предложил следующие варианты.
Задания организованы Apache Airflow - я мог бы добавить дополнительную задачу в DAG, чтобы разархивировать файл, использовать sed, чтобы заменить CR
на '', а затем повторно сжать файлы перед заданием spark это запустить. (Файлы примечаний архивируются впоследствии в формате gzip, следовательно, сжимаются повторно)
Если возможно, используйте API HDFS для выполнения той же задачи.
Если возможно, используйте Spark API, чтобы заменить CR
на '' перед разделением символом LF.
Я знаю, что вариант 1 возможен, но, возможно, немного громоздок. Кто-нибудь может посоветовать, возможны ли варианты 2 или 3 или есть какой-то более простой метод предварительной обработки моих данных.
Приветствие.
Терри