Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Клонируйте таблицу 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 или другие параметры. - Клонированная таблица имеет журнал, независимый от исходной таблицы. Запросы на поездки во времени в клонированную таблицу не работают с теми же входными данными, что и в исходной таблице.