Предварительно обработать сжатый файл перед обработкой в ​​Spark - PullRequest
1 голос
/ 11 июля 2019

У меня есть искра, которая обрабатывает несколько сжатых файлов. Файлы имеют кодировку 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 на '' решит проблему, и я предложил следующие варианты.

  1. Задания организованы Apache Airflow - я мог бы добавить дополнительную задачу в DAG, чтобы разархивировать файл, использовать sed, чтобы заменить CR на '', а затем повторно сжать файлы перед заданием spark это запустить. (Файлы примечаний архивируются впоследствии в формате gzip, следовательно, сжимаются повторно)

  2. Если возможно, используйте API HDFS для выполнения той же задачи.

  3. Если возможно, используйте Spark API, чтобы заменить CR на '' перед разделением символом LF.

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

Приветствие.

Терри

...