Эволюция схемы в формате паркета
В настоящее время мы используем формат данных Avro в производстве. Из N хороших моментов Avro мы знаем, что он хорош в эволюции схемы.
Сейчас мы оцениваем формат Parquet из-за его эффективности при чтении случайных столбцов. Поэтому, прежде чем двигаться вперед, нас интересует эволюция схемы!
Кто-нибудь знает, возможна ли эволюция схемы в паркете, если да, то как, если нет, то почему. Некоторые презентации говорят, что это возможно, но можно добавить только столбцы в конце
Что это значит?
1 ответ
Эволюция схемы может быть (очень) дорогой, потому что для выяснения схемы вы должны в основном прочитать все файлы паркета и согласовать / объединить ее схемы во время чтения, что может быть дорогостоящим в зависимости от того, сколько файлов / сколько столбцов в наборе данных.
Вот почему в Spark 1.5 они отключили эволюцию схемы (по умолчанию, но ее можно снова включить). http://spark.apache.org/docs/latest/sql-programming-guide.html:
Поскольку объединение схем является относительно дорогой операцией и в большинстве случаев не является необходимостью, по умолчанию мы отключили ее, начиная с 1.5.0.
Без эволюции схемы вы можете прочитать схему из одного файла паркета, и при чтении остальных файлов предположите, что она останется прежней.
Эволюция схемы паркета зависит от реализации.
У улья например есть ручка
parquet.column.index.access = ложь
что вы можете настроить отображение схемы по именам столбцов, а не по индексам столбцов. Тогда вы можете удалить столбцы, а не просто добавить.
Как я уже сказал, это зависит от реализации, например, Impala не будет правильно читать такие паркетные таблицы (исправлено в недавнем выпуске Impala 2.6): http://community.cloudera.com/t5/Interactive-Short-cycle-SQL/ внешний стол сохраненного-As-паркет-может-не-использование поле внутри-а / тр / 36012
Spark, начиная с версии 2.0.2, по-прежнему поддерживает только добавление столбцов: http://spark.apache.org/docs/latest/sql-programming-guide.html.
Пользователи могут начать с простой схемы и постепенно добавлять дополнительные столбцы в схему по мере необходимости. Таким образом, пользователи могут получить несколько файлов Parquet с разными, но взаимно совместимыми схемами. Источник данных Parquet теперь может автоматически обнаруживать этот случай и объединять схемы всех этих файлов.
PS. Я видел, что некоторые люди делают более гибкими изменения схемы: они создают представление поверх реальных таблиц паркета, которое отображает две (или более) разные, но совместимые схемы, в одну общую схему. Допустим, вы добавили одно новое поле (registration_date
) и уронил еще один столбец (last_login_date
) в вашем новом выпуске, то это будет выглядеть так:
CREATE VIEW datamart.unified_fact_vw
AS
SELECT f1..., NULL as registration_date
FROM datamart.unified_fact_schema1 f1
UNION ALL
SELECT f2..., NULL as last_login_date
FROM datamart.unified_fact_schema2 f2
;
у вас есть идея.. Хорошо, что она будет работать одинаково на всех sql на диалектах Hadoop (как я уже упоминал выше, Hive, Impala и Spark), и при этом сохранит все преимущества таблиц Parquet (хранение в столбцах, push-down и т. д.),
В дополнение к ответу выше, другой вариант заключается в
"spark.hadoop.parquet.enable.summary-metadata" to "true"
Что это делает, создает сводные файлы со схемой, когда вы пишете файлы. При сохранении вы увидите файлы сводных файлов '_metadata'
а также '_common_metadata'
, _common_metadata
является сжатой схемой, которая читается каждый раз, когда вы читаете файл паркета. Это делает чтение очень быстрым, поскольку у вас уже есть схема. Spark ищет эти файлы схемы, если они есть, чтобы получить схему.
Обратите внимание, что это делает запись очень медленной, так как Spark должен объединить схему всех файлов и создать этот файл схемы.
У нас была похожая ситуация, когда схема паркета изменилась. Что мы сделали, так это установили вышеуказанный конфиг true
на некоторое время после изменения схемы, чтобы файлы схемы были сгенерированы, а затем установите его обратно false
, В течение некоторого времени нам приходилось идти на компромисс с медленной записью, но после генерации файлов схемы, установив ее в false
послужил цели. И с бонусом чтения файлов быстрее.