Вопрос или проблема
Я использую Iceberg с PostgreSQL в качестве каталога, MinIO в качестве хранилища данных и Spark для взаимодействия с Iceberg. Мое приложение может принимать нескольких пользователей, работающих с одной и той же таблицей одновременно, используя Spark SQL. Теперь, когда вносится любое обновление в эту таблицу (INSERT, UPDATE и/или DELETE), создается снимок, отслеживающий эти изменения. Теперь я хочу отслеживать, какой пользователь вносит какие изменения, и для этого я хочу добавить свойство userid
к свойствам снимка, которые доступны через столбец summary
таблицы снимков.
С командой INSERT я могу конвертировать ее в DataFrame Spark и выполнить следующее, чтобы добавить userid
к свойствам снимка:
# Предполагая, что df - это DataFrame, созданный для команды INSERT
df.write.mode("append").option("snapshot-property.userid", 123).insertInto("iceberg.ns.tbl")
Но я не могу выполнить ту же задачу, выполняя команду UPDATE или DELETE.
Я также пытался использовать ветвление, но когда мы пытаемся объединить данные обратно в основную ветку, проблема в том, что должен быть столбец ID для объединения данных, и если в ветвленной таблице слишком много строк, то объединение будет долгой и ресурсозатратной задачей.
Есть ли способ передать snapshot-property.userid
как часть запроса Spark SQL? Я искал информацию в интернете, в документации Iceberg и Spark, а также у ChatGPT, но нигде не нашел решения по этому поводу.
Если есть какой-то лучший способ, чем это, то я тоже готов его выслушать.
Ответ или решение
Вопрос: Информация о пользователе в снимках таблицы Iceberg
При работе с Apache Iceberg и PostgreSQL в качестве каталога данных для хранения, важно не только отслеживать изменения, но и идентифицировать, кто именно вносит изменения в данные. Это особенно актуально в многопользовательских приложениях, где несколько пользователей могут одновременно взаимодействовать с одной и той же таблицей через Spark SQL.
Зачем отслеживать пользователя?
Отслеживание изменений, внесенных пользователем в таблицы Iceberg, выполняет несколько задач:
- Аудит: Позволяет возвращаться к версии данных и понимать, кто, когда и какие изменения вносил.
- Отладка: Облегчает процесс выявления ошибок, связанных с пользовательскими изменениями.
- Контроль: Позволяет администраторам данных контролировать действия пользователей.
С учетом вышесказанного, основной задачей является добавление свойства userid
в свойства снимков, которые хранятся в столбце summary
таблицы снимков.
Реализация для команд INSERT
Как упоминали вы, для команды INSERT
, можно использовать следующий подход:
# Предполагается, что df - это dataframe, созданный для команды INSERT
df.write.mode("append").option("snapshot-property.userid", 123).insertInto("iceberg.ns.tbl")
Здесь все просто: используется метод option
, который добавляет информацию о пользователе в метаданные снимка.
Проблемы с командами UPDATE и DELETE
При выполнении команд UPDATE
и DELETE
ситуация несколько усложняется, поскольку стандартный подход через option
не работает. Iceberg не поддерживает добавление свойств в снимки для этих операторов непосредственно через Spark SQL.
Альтернативные подходы
-
Использование транзакционной обработки:
Вместо того чтобы напрямую выполнятьUPDATE
иDELETE
, можно использовать транзакционные операции, такие как:- Создание временной таблицы или DataFrame с нужными изменениями.
- Затем применение команд
MERGE
илиINSERT OVERWRITE
для обновления основной таблицы. Это позволит загрузить информацию об изменениях в отдельные строки, которые затем можно использовать для обновления свойств снимков.
-
Повышение производительности через Partitioning:
Если вы работаете с большими объемами данных, рассмотрите возможность разбивки таблицы (partitioning). Хорошо продуманные схемы партиционирования помогут ускорить процесс объединения данных. -
Создание пользовательских свойств:
Вы можете рассмотреть добавление отдельной таблицы для аудита изменений, которая будет содержать информацию о пользователе, времени и типе операции. Эта таблица может актуализироваться при каждом изменении в основной таблице и обеспечит историю изменений без влияния на производительность операций с основными данными.
Заключение
Несмотря на ограничения текущих возможностей Iceberg в контексте обновлений и удалений, вы можете использовать различные подходы для отслеживания идентификаторов пользователей. Ключевым аспектом является выбор подхода, который хорошо вписывается в структуру вашего приложения и требования к производительности данных. Не забывайте также следить за обновлениями в документации Apache Iceberg и Spark, так как со временем могут появиться новые возможности и улучшения для работы с метаданными снимков.