Клонирование таблицы в Azure Databricks

Клонируйте таблицу Delta Lake или Apache Iceberg с помощью команды CLONE, чтобы создать независимую копию на определённой версии. Глубокие клоны копируют данные и метаданные. Неглубокие клоны копируют только метаданные и ссылают на исходные файлы данных, используя меньше вычислений и хранилища, чем глубокие клоны.

Azure Databricks также поддерживает клонирование таблиц Parquet и Apache Iceberg. См. Инкрементальное клонирование таблиц Parquet и Apache Iceberg в Delta Lake и Клонирование управляемой таблицы Iceberg.

Дополнительные сведения об использовании клона с каталогом Unity см. в разделе "Мелкий клон" для таблиц каталога Unity.

Note

Databricks рекомендует использовать OpenSharing для предоставления доступа только для чтения к таблицам в разных организациях. См. раздел "Что такое OpenSharing?".

Типы клонирования

Доступны следующие типы клонов:

Type Синтаксис SQL Description
Глубокое клонирование CLONE или DEEP CLONE Копирует данные и метаданные из исходной таблицы в целевой объект клонирования, включая метаданные потока. Поток, записываемый в исходную таблицу, можно остановить и продолжить в целевом объекте клонирования, от которого он остался.
Поверхностное клонирование SHALLOW CLONE Копирует только метаданные из исходной таблицы в целевой объект клонирования. Файлы данных не копируются. Поверхностные клоны обходятся дешевле, поскольку эта операция требует меньше вычислительных ресурсов и места на диске.

Клонированные метаданные включают в себя: схему, сведения о секционированиях, инвариантные элементы, допустимость null и TBLPROPERTIES. Только для глубоких клонов копируются также данные потока и метаданные COPY INTO. Не клонируются следующие метаданные: описание таблицы, метаданные фиксации, определяемые пользователем, история таблицы Delta Lake и свойства Unity Catalog, такие как теги.

Note

Потоковые таблицы и материализованные представления не поддерживают CLONE. Нельзя использовать потоковую таблицу или материализованное представление в качестве источника или целевого объекта глубокого или мелкого клона. См. ограничения и ограничения.

Метрики клонирования

CLONE передает следующие метрики в виде DataFrame из одной строки после завершения операции:

  • source_table_size: размер исходной таблицы, клонированной в байтах.
  • source_num_of_files — число файлов в исходной таблице;
  • num_removed_files — если выполняется замена таблицы, количество файлов, удаляемых из текущей таблицы;
  • num_copied_files — количество файлов, скопированных из источника (0 в случае поверхностных клонов);
  • removed_files_size — размер в байтах файлов, удаляемых из текущей таблицы;
  • copied_files_size — размер в байтах файлов, скопированных в таблицу.

Пример метрик клонирования

Permissions

Необходимо настроить разрешения для управления доступом к таблицам Azure Databricks и поставщика облачных служб.

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

Для глубоких и поверхностных клонов требуются следующие разрешения:

  • разрешение SELECT для исходной таблицы.
  • Если вы используете CLONE для создания новой таблицы, вам нужно иметь разрешение CREATE на базе данных, в которой создается таблица.
  • Если вы используете CLONE для замены таблицы, вам необходимо иметь разрешение MODIFY для таблицы.

Разрешения поставщика облачных служб

Читатели глубокого клона нуждаются в доступе на чтение к каталогу клона. Для записи требуется доступ к каталогу клона.

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

Примеры

Создание глубоких или поверхностных клонов

В следующих примерах кода показано, как создавать глубокие и мелкие клоны:

SQL

Создайте глубокую копию:

CREATE TABLE target_table CLONE source_table;

Замените существующий целевой объект:

CREATE OR REPLACE TABLE target_table CLONE source_table;

Создайте глубокий клон или пропустите, если целевой объект уже существует:

CREATE TABLE IF NOT EXISTS target_table CLONE source_table;

Создайте неглубокий клон в последней версии, в определенной версии или в определенной метке времени. Метка времени может быть строкой дат, например '2019-01-01' или выражением date_sub(current_date(), 1).

CREATE TABLE target_table SHALLOW CLONE source_table;

CREATE TABLE target_table SHALLOW CLONE source_table VERSION AS OF version;

CREATE TABLE target_table SHALLOW CLONE source_table TIMESTAMP AS OF timestamp_expression;

Python

API Python DeltaTable предназначен специально для Delta Lake.

Клонируйте источник в последней версии:

from delta.tables import *

deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=True, replace=False)

Клонируйте источник в определенной версии:

deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False)

Клонируйте источник на определенной отметке времени:

deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)

Scala

Scala API DeltaTable специфичен для Delta Lake.

Клонируйте источник в последней версии:

import io.delta.tables._

val deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=true, replace=false)

Клонируйте источник в определенной версии:

deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false)

Клонируйте источник на определенной отметке времени:

deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false)

Сведения о синтаксисе см. в CREATE TABLE CLONE.

Проверка метаданных, скопированных во время CLONE

В этом примере показаны метаданные, которые копируются и не копируются во время операций CLONE, в частности TBLPROPERTIES, теги Unity Catalog и история Delta Lake.

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

CREATE OR REPLACE TABLE test_clone_source (id INT, val STRING)
TBLPROPERTIES ('my.custom.prop' = 'hello', 'delta.logRetentionDuration' = '12 days');

ALTER TABLE test_clone_source SET TAGS ('team' = 'data-eng', 'env' = 'prod');
INSERT INTO test_clone_source VALUES (1, 'a');
INSERT INTO test_clone_source VALUES (2, 'b');

Создайте глубокую копию и поверхностную копию:

CREATE OR REPLACE TABLE test_clone_deep DEEP CLONE test_clone_source;

CREATE TABLE test_clone_shallow SHALLOW CLONE test_clone_source;

Note

В каталоге Unity нельзя использовать CREATE OR REPLACE для перезаписи существующего неглубокого клона. Используйте DROP TABLE, затем CREATE TABLE, или используйте новое имя таблицы. См. Ограничения.

Убедитесь, что TBLPROPERTIES скопированы в оба клона:

SHOW TBLPROPERTIES test_clone_source;
SHOW TBLPROPERTIES test_clone_deep;
SHOW TBLPROPERTIES test_clone_shallow;

Убедитесь, что теги Unity Catalog не копируются при создании клонов:

SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_source';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_deep';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_shallow';

Убедитесь, что журнал Delta Lake не копируется в клоны:

DESCRIBE HISTORY test_clone_source;
DESCRIBE HISTORY test_clone_deep;
DESCRIBE HISTORY test_clone_shallow;

Очистка

DROP TABLE IF EXISTS test_clone_shallow;
DROP TABLE IF EXISTS test_clone_source;
DROP TABLE IF EXISTS test_clone_deep;

архивация данных;

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

Выполните следующую команду один раз в месяц, чтобы синхронизировать архив:

CREATE OR REPLACE TABLE archive_table CLONE my_prod_table

Воспроизведение модели машинного обучения

Для вариантов использования машинного обучения может потребоваться архивировать версию таблицы, которая использовалась для обучения модели машинного обучения. Будущие модели можно протестировать с помощью этого архивного набора данных. Чтобы архивировать версию набора данных с помощью CLONE, выполните следующие действия:

Например, чтобы архивировать версию таблицы, используемой для обучения модели в версии 15:

CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15

Краткосрочные эксперименты на производственном столе

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

Создайте неглубокий клон рабочей таблицы:

CREATE TABLE my_test SHALLOW CLONE my_prod_table;

Note

В каталоге Unity нельзя использовать CREATE OR REPLACE для перезаписи существующего неглубокого клона. Используйте DROP TABLE, затем CREATE TABLE, или используйте новое имя таблицы. См. Ограничения.

Выполните обновления и проверки в клоне:

UPDATE my_test WHERE user_id is null SET invalid=true;

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

MERGE INTO my_prod_table
USING my_test
ON my_test.user_id <=> my_prod_table.user_id
WHEN MATCHED AND my_test.user_id is null THEN UPDATE *;

Удалите клон после завершения:

DROP TABLE my_test;

Переопределение свойств таблицы

Переопределения свойств таблицы полезны в следующих случаях:

  • добавления заметок к таблицам с данными о владельце или пользователе при совместном использовании данных разными подразделениями;
  • Архивация таблиц Delta Lake, когда требуется время перемещения по архиву. Данные и периоды хранения журналов можно указать независимо для архивной таблицы. Рассмотрим пример.

SQL

Для таблицы Delta Lake:

CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)

Для таблицы Айсберга:

CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)

Python

API DeltaTable Python специально предназначен для Delta Lake.

dt = DeltaTable.forName(spark, "prod.my_table")
tblProps = {
"delta.logRetentionDuration": "3650 days",
"delta.deletedFileRetentionDuration": "3650 days"
}
dt.clone(target="archive_table", isShallow=False, replace=True, tblProps)

Scala

API Scala DeltaTable специфичен для Delta Lake.

val dt = DeltaTable.forName(spark, "prod.my_table")
val tblProps = Map(
"delta.logRetentionDuration" -> "3650 days",
"delta.deletedFileRetentionDuration" -> "3650 days"
)
dt.clone(target="archive_table", isShallow = false, replace = true, properties = tblProps)

Поведение операции клонирования для устаревшего хранилища метаданных Hive

Important

Начиная с Databricks Runtime 13.3 LTS, управляемые таблицы в Unity Catalog поддерживают поверхностное клонирование. Поведение клонирования для таблиц каталога Unity отличается от поведения клонирования в других средах. См. раздел "Мелкое клонирование таблиц каталога Unity".

Для таблицы Delta Lake, зарегистрированной в хранилище метаданных Hive или коллекции файлов, не зарегистрированных в качестве таблицы, клон имеет следующее поведение:

  • Изменения, внесённые в глубокие или поверхностные клоны, не влияют на исходную таблицу.
  • Поверхностные клоны ссылаются на файлы данных в исходном каталоге. Если вы запускаете VACUUM для исходной таблицы, клиенты больше не смогут читать эти файлы с данными, и это приводит к возникновению исключения FileNotFoundException. Чтобы восстановить, выполните клонирование с replace помощью мелкого клона. Если это происходит часто, рассмотрите возможность использования глубокого клона, который не зависит от исходной таблицы.
  • Глубокие клоны не зависят от исходной таблицы, но являются дорогостоящими для создания, так как они копируют данные и метаданные.
  • Клонирование с помощью replace в целевой объект, у которого уже есть таблица по этому пути, создаёт журнал Delta, если он ещё не существует. Выполните VACUUM, чтобы очистить имеющиеся данные.
  • Для существующих таблиц Delta Lake клонирование создает новую инкрементальную фиксацию, которая включает только новые метаданные и данные, появившиеся в исходной таблице с момента последнего клонирования.
  • Клонирование таблицы отличается от Create Table As Select (CTAS). Клон копирует метаданные исходной таблицы в дополнение к данным. Вам не нужно указывать секционирование, формат, инвариантность, возможность null или другие параметры.
  • Клонированная таблица имеет журнал, независимый от исходной таблицы. Запросы на поездки во времени в клонированную таблицу не работают с теми же входными данными, что и в исходной таблице.