Spark меняет схему при записи в Avro

У меня есть задание Spark (в CDH 5.5.1), которое загружает два файла Avro (оба с одной и той же схемой), объединяет их для создания DataFrame (также с той же схемой), а затем записывает их обратно в Avro.

Задание явно сравнивает две входные схемы, чтобы убедиться, что они одинаковы.

Это используется для объединения существующих данных с несколькими обновлениями (поскольку файлы неизменяемы). Затем я заменяю исходный файл новым комбинированным файлом, переименовывая их в HDFS.

Однако, если я повторю процесс обновления (т. е. попытаюсь добавить некоторые дополнительные обновления в ранее обновленный файл), задание завершится ошибкой, потому что схемы теперь другие! Что происходит?


person DNA    schedule 26.07.2016    source источник


Ответы (1)


Это связано с поведением пакета spark-avro.

При записи в Avro spark-avro записывает все как объединения заданного типа вместе с опцией null.

Другими словами, "string" становится ["string", "null"], поэтому каждое поле становится пустым.

Если ваша входная схема уже содержит только поля, допускающие значение NULL, эта проблема не проявляется.

Это не упоминается на странице spark-avro, но описано как одно из ограничений spark-avro в некоторых документация Cloudera:

Поскольку Spark преобразует типы данных, обратите внимание на следующее:

  • Перечислимые типы стираются — перечисляемые типы Avro становятся строками при чтении в Spark, поскольку Spark не поддерживает перечисляемые типы.
  • Объединения на выходе — Spark записывает все как объединения заданного типа вместе с нулевым параметром.
  • Схема Avro меняется — Spark считывает все во внутреннее представление. Даже если вы просто прочитаете, а затем запишете данные, схема вывода будет другой.
  • Переупорядочивание схемы Spark — Spark переупорядочивает элементы в своей схеме при записи их на диск, чтобы элементы, на которых выполняется секционирование, были последними элементами.

См. также эту проблему github: (spark-avro 92)

person DNA    schedule 26.07.2016