Как обрабатывать файлы, каждый из которых имеет собственный заголовок с разным количеством столбцов с помощью Apache Spark?

У меня есть :

  1. миллионы файлов на s3
  2. формат несовместим с https://github.com/databricks/spark-csv, поскольку он ужасная спецификация DSV, которая требует особой обработки, строка заголовка начинается со специального символа, и каждый файл может содержать в себе несколько заголовков (идиосинкразия поставщика), обычно количество столбцов изменяется во времени даже в одном файле (если он имеет несколько заголовков в Это) ...
  3. у каждого файла есть заголовок, но заголовки меняются (разные поля / столбцы)
  4. по соображениям производительности мне нужно сделать что-л. вот так: read.text("s3n://2016/01/*")

Я не могу найти способ получить заголовок и соответствующие ему строки, чтобы обработать его вместе. Imho custom Partitioner, который будет разделять данные на файл, не может быть записан, а API rdd / dataset / dataframe не предоставляет никаких средств, которые могли бы это сделать ...

Любая идея? Я могу использовать Spark 2.0.0. Мне кажется, что Spark не очень дружелюбен к файлам DSV с заголовками, особенно если заголовки различаются ...


person lisak    schedule 19.05.2016    source источник


Ответы (1)


Вероятно, самой простой стратегией было бы организовать ваши файлы каким-либо разумным способом для дальнейшей обработки или создать каталог, какой файл какого типа, а затем использовать это для создания RDD.

См. http://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219, где приведены примеры вызова клиента amazon s3 изнутри rdd. Вы можете использовать это для создания этого каталога.

person Marcin    schedule 19.05.2016
comment
Эй, я прочитал ту статью на kinja.com, я обязательно сделаю это, когда добавлю больше машин. Обновил описание формата. Я думаю, что я скопирую / вставлю код из spark-csv, который работает с разделами и позволяет мне перебирать разделы, каждый из которых представляет один файл ... - person lisak; 20.05.2016
comment
Еще один вопрос: можно ли переразбить RDD по файлам? Чтобы я надежно получил один раздел на файл? Вместо реализации настраиваемого источника данных? - person lisak; 20.05.2016
comment
Я немного сбит с толку, потому что spark-csv библиотека использует только sc.textFile(...), а затем rdd.mapPartitions { lines => lines.head; ... }, что не обязательно должно разрешать одно разделение на файл, верно? - person lisak; 20.05.2016
comment
@lisak Смысл RDD в том, что он представляет собой однородную последовательность. Если вы пытаетесь получить неоднородный RDD, вы, вероятно, делаете что-то не так. Разделы не имеют отношения к файлам. Когда ваши данные загружены, они не зависят от своего источника. - person Marcin; 20.05.2016
comment
Мы не используем hdfs (и не хотим), поэтому файлы влияют на разделы в нашей системе, потому что мы обычно разбиваем rdd на fileName / filePath в конце, чтобы каждая машина могла безопасно хранить данные в файле и что-то с ними делать. ... - person lisak; 20.05.2016
comment
@lisak Итак? Кто что сказал про HDFS? - person Marcin; 20.05.2016
comment
мы используем хранилище s3 с логически разделенными данными, такими как 2016/05/21/19/partition.json, поэтому, чтобы вывести результат искры, я должен быть обеспокоен взаимосвязью между разделами и файлами ... - person lisak; 21.05.2016
comment
Честно говоря, это похоже на то, что вы пытаетесь выполнить вычисление стиля mapreduce с использованием искры. Дело не в том, что это невозможно сделать, и не в том, что это не будет быстрее. Однако это будет сложнее, пока вы не поймете, как работать с абстракциями Spark. - person Marcin; 21.05.2016