Обновление значений в файле паркета apache

У меня есть довольно здоровенный паркетный файл, в котором мне нужно изменить значения для одного из столбцов. Один из способов сделать это - обновить эти значения в исходных текстовых файлах и воссоздать паркетный файл, но мне интересно, есть ли менее затратное и более простое решение для этого.


person marcin_koss    schedule 03.03.2015    source источник
comment
Нет. Вам необходимо воссоздать файл.   -  person Dan Osipov    schedule 04.03.2015
comment
@DanOsipov Спасибо. Я предполагаю, что это ограничение связано с использованием различных алгоритмов сжатия, где было бы непросто или даже невозможно обновить значения столбцов.   -  person marcin_koss    schedule 06.09.2016
comment
Я бы сказал, что это гораздо более фундаментальный вопрос, чем вопрос, связанный с паркетом. В мире больших объемов данных, где часто используется паркет, неизменность - это то, о чем вы хотели бы позаботиться. С этой точки зрения вы хотели бы загрузить данные, преобразовать их, а затем снова записать. Вы можете подумать о написании только тех столбцов, которые вам нужны, что сделает его более эффективным, поскольку это формат по столбцам.   -  person Fokko Driesprong    schedule 15.12.2016
comment
Я понял, что вы хотите обновить поле, уже написанное в предыдущем прогоне. Может, эта статья могла бы помочь. Я не продвигаю никакой продукт. Пожалуйста, сосредоточьтесь на задействованных концепциях, а не на рекламируемых продуктах. databricks.com/blog/ 29.10.2018 г. /   -  person Richard Gomes    schedule 29.06.2020


Ответы (4)


Начнем с основ:

Паркет - это формат файла, который необходимо сохранить в файловой системе.

Ключевые вопросы:

  1. Поддерживает ли паркет append операции?
  2. Допускает ли файловая система (а именно, HDFS) append файлы?
  3. Может ли рабочая среда (Spark) реализовывать append операции?

Ответы:

  1. parquet.hadoop.ParquetFileWriter поддерживает только CREATE и OVERWRITE; нет режима append. (Не уверен, но это потенциально может измениться в других реализациях - дизайн паркета поддерживает append)

  2. HDFS разрешает append для файлов с помощью свойства dfs.support.append

  3. Фреймворк Spark не поддерживает append существующие паркетные файлы и не планирует этого; см. эту JIRA

Не рекомендуется добавлять файлы к существующему файлу в распределенных системах, особенно с учетом того, что у нас может быть два писателя одновременно.

Более подробная информация здесь:

person KrazyGautam    schedule 25.03.2017
comment
Спасибо за подробный ответ и справочную информацию. это полезно - person Keith; 22.02.2018

Существуют обходные пути, но вам нужно создать файл паркета определенным образом, чтобы его было легче обновлять.

Лучшие практики:

A. Используйте группы строк для создания паркетных файлов. Вам необходимо оптимизировать количество строк данных, которые могут входить в группу строк, прежде чем такие функции, как сжатие данных и кодирование словаря, перестанут работать.

B. Просканируйте группы строк по очереди и определите, какие группы строк необходимо обновить. Создайте новые файлы паркета с измененными данными для каждой измененной группы строк. Более эффективно с точки зрения памяти работать с данными по одной группе строк, а не со всем в файле.

C. Восстановите исходный файл паркета, добавив немодифицированные группы строк и измененные группы строк, сгенерированные путем чтения одного файла паркета для каждой группы строк.

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

Теоретически это должно быть легко добавить к существующему файлу паркета, если вы просто удалите нижний колонтитул (информация о статистике), добавите новые группы строк и добавите новый нижний колонтитул со статистикой обновления, но нет API / библиотеки, поддерживающей это ..

person David Lee    schedule 06.09.2018

Взгляните на этот хороший блог, который может ответить на ваш вопрос и предоставить метод для выполнения обновлений с помощью 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

Отказ от ответственности: я не писал эти блоги, я просто читал их и обнаружил, что они могут быть полезны другим.

person Anandkumar    schedule 08.07.2018
comment
Я понял, что вопрос связан с чем-то более сложным, чем просто добавление разделов, как объясняется в сообщении в блоге. Предположим, сценарий, в котором некоторые данные действительны до тех пор, пока не появятся новые данные, который может быть легко реализован в базе данных SQL, но требует творческого подхода в случае, если вы не можете просто обновить поле записи, как в случае паркетных файлов. - person Richard Gomes; 29.06.2020

Вы должны заново создать файл, это способ Hadoop. Особенно, если файл сжат.

Другой подход (очень распространенный в больших данных) - выполнить обновление другого файла Parquet (или ORC), а затем JOIN / UNION во время запроса.

person Thomas Decaux    schedule 12.06.2017