Обновление значений в файле Apache Parquet

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

4 ответа

Решение

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

  1. Паркет, если fileFormat, но должен быть сохранен в файловой системе.
  2. Поддерживает ли паркет поддержку??
  3. Разрешает ли файловая система (HDFS) добавить файл.
  4. Даже если все верно, каркас работы (Spark) способен обрабатывать добавление

Ответы:

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

  2. HDFS hdfs позволяет добавлять файлы с помощью (свойство dfs.support.append)

  3. Spark Framework не поддерживает добавление к существующим файлам паркета.

    https://issues.apache.org/jira/browse/SPARK-18199

Пожалуйста, пройдите

http://bytepadding.com/big-data/spark/read-write-parquet-files-using-spark/

http://bytepadding.com/linux/understanding-basics-of-filesystem/

для подробного понимания.

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

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

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

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

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

Удивительно быстро собрать файл паркета с помощью групп строк.

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

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

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

Посмотрите на этот хороший блог, который может ответить на ваш вопрос и предоставить метод для выполнения обновлений с помощью Spark (Scala):

http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html

Скопируйте и вставьте из блога:

когда нам нужно редактировать данные, в наших структурах данных (Parquet), которые являются неизменными.

Вы можете добавить разделы в файлы Parquet, но вы не можете редактировать данные на месте.

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

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

http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html

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

Другие вопросы по тегам