INTEGRITY Документация

Удаление данных

Удаление данных из R2 Data Catalog или любого другого каталога Apache Iceberg должно выполняться в рамках транзакции через сам каталог. Удаление файлов метаданных или данных вручную может привести к повреждению каталога данных.

Автоматическое обслуживание таблиц

R2 Data Catalog может автоматически управлять операциями обслуживания таблиц, такими как истечение срока действия снимков и уплотнение. Эти непрерывные операции помогают снизить задержки и затраты на хранение.

Если автоматическое обслуживание не включено, эти операции придётся выполнять вручную.

Подробнее см. в обслуживание таблиц документация.

Примеры включения автоматического обслуживания таблиц в R2 Data Catalog

# Enable automatic snapshot expiration for entire catalog
npx wrangler r2 bucket catalog snapshot-expiration enable my-bucket \
	--older-than-days 30 \
	--retain-last 5

# Enable automatic compaction for entire catalog
npx wrangler r2 bucket catalog compaction enable my-bucket \
	--target-size 256

Дополнительные примеры смотрите в управление каталогами документация.

Ручное удаление данных

Вам нужно вручную удалить данные для:

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

Удаление строк из таблицы

# Creates new snapshots and marks old files for cleanup
spark.sql("""
	DELETE FROM r2dc.namespace.table_name
	WHERE column_name = 'value'
""")

# The following is effectively a TRUNCATE operation
spark.sql("DELETE FROM r2dc.namespace.table_name")

# For large deletes, use partitioned tables and delete entire partitions for faster performance:
spark.sql("""
    DELETE FROM r2dc.namespace.table_name
    WHERE date_partition < '2024-01-01'
""")

Удаление таблиц и пространств имён

# Removes table from catalog but keeps data files in R2 storage
spark.sql("DROP TABLE r2dc.namespace.table_name")

# ⚠️  DANGER: Permanently deletes all data files from R2
# This operation cannot be undone
spark.sql("DROP TABLE r2dc.namespace.table_name PURGE")

# Use CASCADE to drop all tables within the namespace
spark.sql("DROP NAMESPACE r2dc.namespace_name CASCADE")

# You will need to PURGE the tables before running CASCADE to permanently delete data files
# This can be done with a loop over all tables in the namespace
tables = spark.sql("SHOW TABLES IN r2dc.namespace_name").collect()
for row in tables:
	table_name = row['tableName']
  spark.sql(f"DROP TABLE r2dc.namespace_name.{table_name} PURGE")
spark.sql("DROP NAMESPACE r2dc.namespace_name CASCADE")

Операции ручного обслуживания

# Remove old metadata and data files marked for deletion
# The following retains the last 5 snapshots and deletes files older than Nov 28, 2024
spark.sql("""
	CALL r2dc.system.expire_snapshots(
    table => 'r2dc.namespace_name.table_name',
    older_than => TIMESTAMP '2024-11-28 00:00:00',
     retain_last => 5
  )
""")

# Removes unreferenced data files from R2 storage (orphan files)
spark.sql("""
  CALL r2dc.system.remove_orphan_files(
    table => 'namespace.table_name'
  )
""")

# Rewrite data files with a target file size (e.g., 512 MB)
spark.sql("""
  CALL r2dc.system.rewrite_data_files(
    table => 'r2dc.namespace_name.table_name',
    options => map('target-file-size-bytes', '536870912')
  )
""")

О метаданных Apache Iceberg

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

Что происходит при удалении

Apache Iceberg поддерживает два режима удаления: Copy-on-Write (COW) и Merge-on-Read (MOR). Оба варианта создают новый снимок и помечают старые файлы для удаления, но по-разному выполняют само удаление:

Аспект Copy-on-Write (COW) Merge-on-Read (MOR)
Как работают удаления Перезаписывает файлы данных без удаленных строк Создаёт файлы удаления, помечающие строки для пропуска
Производительность запросов Быстро (слияние не требуется) Медленнее (требует слияния во время чтения)
Производительность записи Медленнее (перезаписывает файлы данных) Быстро (записываются только маркеры удаления)
Влияние на хранилище Немедленно создаёт новые файлы данных Со временем накапливает файлы удаления
Потребности в обслуживании Истечение срока действия снимков Истечение срока действия снимков и уплотнение (rewrite_data_files)
Подходит для Нагрузки с преобладанием чтения Нагрузки с большим количеством записи и частыми мелкими изменениями

Распространённые операции удаления

Эти операции работают одинаково как для таблиц COW, так и для таблиц MOR:

Операция Что это делает Данные удалены? Обратимо?
DELETE FROM Удаляет строки, соответствующие условию Нет (помечено для очистки) С помощью путешествия во времени1
DROP TABLE Удаляет таблицу из каталога Нет Да (если существуют файлы данных)
DROP TABLE ... PURGE Удаляет таблицу и данные Да Нет
expire_snapshots Удаляет устаревшие снимки и файлы Да Нет
remove_orphan_files Удаляет файлы, на которые нет ссылок Да Нет

Операции, специфичные для MOR

Для таблиц Merge-on-Read может потребоваться вручную применять удаления, чтобы сохранить производительность:

Операция Что это делает Когда использовать
rewrite_data_files (сжатие) Применяет удаления и объединяет файлы Когда производительность запросов снижается из-за большого количества delete-файлов

Сноски

  1. Путешествие во времени доступно до expire_snapshots называется ↩