У меня есть довольно здоровенный паркетный файл, в котором мне нужно изменить значения для одного из столбцов. Один из способов сделать это - обновить эти значения в исходных текстовых файлах и воссоздать паркетный файл, но мне интересно, есть ли менее затратное и более простое решение для этого.
Обновление значений в файле паркета apache
Ответы (4)
Начнем с основ:
Паркет - это формат файла, который необходимо сохранить в файловой системе.
Ключевые вопросы:
- Поддерживает ли паркет
append
операции? - Допускает ли файловая система (а именно, HDFS)
append
файлы? - Может ли рабочая среда (Spark) реализовывать
append
операции?
Ответы:
parquet.hadoop.ParquetFileWriter
поддерживает толькоCREATE
иOVERWRITE
; нет режимаappend
. (Не уверен, но это потенциально может измениться в других реализациях - дизайн паркета поддерживаетappend
)HDFS разрешает
append
для файлов с помощью свойстваdfs.support.append
Фреймворк Spark не поддерживает
append
существующие паркетные файлы и не планирует этого; см. эту JIRA
Не рекомендуется добавлять файлы к существующему файлу в распределенных системах, особенно с учетом того, что у нас может быть два писателя одновременно.
Более подробная информация здесь:
http://bytepadding.com/big-data/spark/read-write-parquet-files-using-spark/
http://bytepadding.com/linux/understanding-basics-of-filesystem/ а>
Существуют обходные пути, но вам нужно создать файл паркета определенным образом, чтобы его было легче обновлять.
Лучшие практики:
A. Используйте группы строк для создания паркетных файлов. Вам необходимо оптимизировать количество строк данных, которые могут входить в группу строк, прежде чем такие функции, как сжатие данных и кодирование словаря, перестанут работать.
B. Просканируйте группы строк по очереди и определите, какие группы строк необходимо обновить. Создайте новые файлы паркета с измененными данными для каждой измененной группы строк. Более эффективно с точки зрения памяти работать с данными по одной группе строк, а не со всем в файле.
C. Восстановите исходный файл паркета, добавив немодифицированные группы строк и измененные группы строк, сгенерированные путем чтения одного файла паркета для каждой группы строк.
на удивление быстро собрать паркетный файл, используя группы строк.
Теоретически это должно быть легко добавить к существующему файлу паркета, если вы просто удалите нижний колонтитул (информация о статистике), добавите новые группы строк и добавите новый нижний колонтитул со статистикой обновления, но нет API / библиотеки, поддерживающей это ..
Взгляните на этот хороший блог, который может ответить на ваш вопрос и предоставить метод для выполнения обновлений с помощью Spark (Scala):
http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html
Скопировать и вставить из блога:
когда нам нужно отредактировать данные в наших структурах данных (Parquet), которые являются неизменяемыми.
Вы можете добавлять разделы в файлы Parquet, но не можете редактировать данные на месте.
Но в конечном итоге мы можем видоизменить данные, нам просто нужно признать, что мы не будем делать этого на месте. Нам нужно будет воссоздать файлы Parquet, используя комбинацию схем и UDF, чтобы исправить неверные данные.
Если вы хотите постепенно добавлять данные в Parquet (вы не задавали этот вопрос, но он будет полезен другим читателям), обратитесь к этому хорошо написанному блогу:
http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html
Отказ от ответственности: я не писал эти блоги, я просто читал их и обнаружил, что они могут быть полезны другим.
Вы должны заново создать файл, это способ Hadoop. Особенно, если файл сжат.
Другой подход (очень распространенный в больших данных) - выполнить обновление другого файла Parquet (или ORC), а затем JOIN / UNION во время запроса.