Поделиться через


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

Вы можете создать копию существующей таблицы Delta Lake в Azure Databricks в определенной версии с помощью команды clone. Клоны могут быть либо глубокими, либо поверхностными.

Azure Databricks также поддерживает клонирование таблиц Parquet и Iceberg. См. статью Пошаговое клонирование таблиц Parquet и Iceberg в Delta Lake.

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

Примечание.

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

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

  • Глубокий клон — это клон, который копирует данные исходной таблицы в целевой объект клонирования в дополнение к метаданным существующей таблицы. Кроме того, клонируются метаданные потока таким образом, что поток, записывающий данные в таблицу Delta, может быть остановлен в исходной таблице и продолжаться на целевой таблице клона с того же места.
  • Поверхностный клон — это клон, который не копирует файлы данных в целевой объект клонирования. Метаданные таблицы эквивалентны исходным. Создание этих клонов менее затратно.

Клонируемые метаданные включают в себя: схему, сведения о секционировании, инварианты, допустимость значений NULL. Только для глубоких клонов копируются также данные потока и метаданные COPY INTO. Метаданные, которые не клонируются — это описание таблицы и метаданные коммита, определяемые пользователем.

Какова семантика операций клонирования Delta?

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

Внимание

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

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

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

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

SQL

CREATE TABLE target_table CLONE source_table; -- Create a deep clone of source_table as target_table

CREATE OR REPLACE TABLE target_table CLONE source_table; -- Replace the target

CREATE TABLE IF NOT EXISTS target_table CLONE source_table; -- No-op if the target table exists

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; -- timestamp can be like “2019-01-01” or like date_sub(current_date(), 1)

Питон

from delta.tables import *

deltaTable = DeltaTable.forName(spark, "source_table")

deltaTable.clone(target="target_table", isShallow=True, replace=False) # clone the source at latest version

deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False) # clone the source at a specific version

# clone the source at a specific timestamp such as timestamp="2019-01-01"
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)

язык программирования Scala

import io.delta.tables._

val deltaTable = DeltaTable.forName(spark, "source_table")

deltaTable.clone(target="target_table", isShallow=true, replace=false) // clone the source at latest version

deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false) // clone the source at a specific version

deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false) // clone the source at a specific timestamp

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

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

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

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

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

Разрешения

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

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

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

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

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

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

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

Использование клона для архивации данных

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

-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table

Использование клона для воспроизведения моделей машинного обучения

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

-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15

Использование клона для краткосрочных экспериментов в рабочей таблице

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

-- Perform shallow clone
CREATE OR REPLACE TABLE my_test SHALLOW CLONE my_prod_table;

UPDATE my_test WHERE user_id is null SET invalid=true;
-- Run a bunch of validations. Once happy:

-- This should leverage the update information in the clone to prune to only
-- changed files in the clone if possible
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 и истории таблиц или возможность возврата к предыдущим версиям. Вы можете указать сроки хранения данных и журналов независимо для архивной таблицы. Например:

SQL

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

Питон

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

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)