Klonování tabulky v Azure Databricks

Naklonujte tabulku Delta Lake nebo Apache Iceberg pomocí CLONE příkazu k vytvoření nezávislé kopie v konkrétní verzi. Hluboké klony kopírují data i metadata. Mělké klony kopírují pouze metadata a odkazují na zdrojové datové soubory, které využívají méně výpočetních prostředků a úložiště než hluboké klony.

Azure Databricks také podporuje klonování tabulek Parquet a Apache Iceberg. Viz Postupné klonování tabulek Parquet a Apache Iceberg do Delta Lake a Klonování spravované tabulky Iceberg.

Podrobnosti o použití klonování s katalogem Unity naleznete v tématu Mělké klonování pro tabulky katalogu Unity.

Poznámka:

Databricks doporučuje používat OpenSharing k zajištění přístupu jen pro čtení k tabulkám v různých organizacích. Viz Co je OpenSharing?

Typy klonů

K dispozici jsou následující typy klonů:

Typ Syntaxe SQL Description
Hloubkové klonování CLONE nebo DEEP CLONE Zkopíruje data i metadata ze zdrojové tabulky do cíle klonování, včetně metadat datového proudu. Stream, který zapisuje do zdrojové tabulky, se dá zastavit a pokračovat v cíli klonování, ze kterého skončil.
Mělký klon SHALLOW CLONE Zkopíruje pouze metadata ze zdrojové tabulky do cíle klonování. Datové soubory se nekopírují. Mělké klony jsou levnější k vytvoření, protože operace využívá méně výpočetních prostředků a úložného prostoru.

Klonovaná metadata zahrnují: schéma, informace o dělení, invarianty, nulovost a TBLPROPERTIES. Pouze pro hluboké klony se naklonují také metadata datových proudů a COPY INTO. Mezi metadata, která se neklonují, patří popis tabulky, metadata commitu definovaná uživatelem, historie tabulky v systému Delta Lake a vlastnosti katalogu Unity, jako jsou tagy.

Poznámka:

Streamované tabulky a materializovaná zobrazení nepodporují CLONE. Jako zdroj nebo cíl hlubokého nebo mělkového klonu nelze použít streamovací tabulku nebo materializované zobrazení. Viz Omezení a omezení.

Klonované metriky

CLONE po dokončení operace udává následující metriky jako datový rámec s jedním řádkem:

  • source_table_size: Velikost zdrojové tabulky, která se klonuje v bajtech.
  • source_num_of_files: Počet souborů ve zdrojové tabulce.
  • num_removed_files: Pokud se tabulka nahrazuje, kolik souborů se z aktuální tabulky odebere.
  • num_copied_files: Počet souborů, které byly zkopírovány ze zdroje (0 pro mělké klony).
  • removed_files_size: Velikost v bajtech souborů, které jsou odebrány z aktuální tabulky.
  • copied_files_size: Velikost v bajtech souborů zkopírovaných do tabulky.

Příklad klonování metrik

Permissions

Musíte nakonfigurovat oprávnění pro řízení přístupu k tabulce Azure Databricks a poskytovatele cloudu.

Řízení přístupu k tabulkám

Pro hluboké i mělké klony jsou vyžadována následující oprávnění:

  • SELECT oprávnění ke zdrojové tabulce.
  • Pokud k vytvoření nové tabulky používáte CLONE , oprávnění k databázi, CREATE ve které vytváříte tabulku.
  • Pokud k nahrazení tabulky používáte CLONE , musíte mít MODIFY oprávnění k tabulce.

Oprávnění poskytovatele cloudu

Uživatelé hlubokého klonu potřebují oprávnění ke čtení adresáře klonu. Pro zápis do adresáře klonu je vyžadováno oprávnění k zápisu.

Čtenáři mělkých klonů potřebují přístup pro čtení k datovým souborům zdrojové tabulky i k adresáři klonu, protože datové soubory zůstávají ve zdroji. Pro zápis do adresáře klonu je vyžadováno oprávnění k zápisu.

Examples

Vytvořte hluboké nebo mělké klony

Následující příklady kódu ukazují, jak vytvořit hluboké a mělké klony:

SQL

Vytvoření hlubokého klonu:

CREATE TABLE target_table CLONE source_table;

Nahrazení existujícího cíle:

CREATE OR REPLACE TABLE target_table CLONE source_table;

Vytvořte hloubkový klon nebo přeskočte, pokud cíl již existuje:

CREATE TABLE IF NOT EXISTS target_table CLONE source_table;

Vytvořte mělký klon v nejnovější verzi, v konkrétní verzi nebo v určitém časovém razítku. Časové razítko může být řetězec kalendářního data, například '2019-01-01' nebo výraz jako 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

Rozhraní API Python DeltaTable je specifické pro Delta Lake.

Naklonujte zdroj v nejnovější verzi:

from delta.tables import *

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

Naklonujte zdroj v konkrétní verzi:

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

Klonujte zdroj k určitému časovému okamžiku:

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

Scala

Rozhraní Scala DeltaTable API je specifické pro Delta Lake.

Naklonujte zdroj v nejnovější verzi:

import io.delta.tables._

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

Naklonujte zdroj v konkrétní verzi:

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

Klonujte zdroj k určitému časovému okamžiku:

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

Podrobnosti o syntaxi najdete v sekci CREATE TABLE CLONE.

Kontrola metadat zkopírovaných během CLONE

Tento příklad ukazuje metadata, která se během operací CLONE kopírují a nekopírují, konkrétně TBLPROPERTIES, tagy Unity Catalog a historii Delta Lake.

Vytvořte zdrojovou tabulku s vlastní vlastností a ne výchozí dobou uchovávání protokolů a vložte data pro generování historie tabulek:

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');

Vytvořte hluboký klon a mělký klon:

CREATE OR REPLACE TABLE test_clone_deep DEEP CLONE test_clone_source;

CREATE TABLE test_clone_shallow SHALLOW CLONE test_clone_source;

Poznámka:

V Unity Catalogu nemůžete použít CREATE OR REPLACE k přepsání existujícího mělkého klonu. Použijte DROP TABLE následovaný CREATE TABLEnebo použijte nový název tabulky. Viz Omezení.

Ověřte, že TBLPROPERTIES byly zkopírovány do obou klonů:

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

Ověřte, že se značky katalogu Unity nekopírují do klonů:

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';

Ověřte, že se historie Delta Lake do klonů nekopíruje:

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

Odklidit:

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

Archivace dat

Pomocí hloubkového klonování můžete zachovat stav tabulky v určitém časovém okamžiku pro účely archivace. Hloubkové klony můžete synchronizovat přírůstkově, aby se zachoval aktualizovaný stav zdrojové tabulky pro zotavení po havárii.

Spuštěním následujícího příkazu jednou měsíčně synchronizujte archiv:

CREATE OR REPLACE TABLE archive_table CLONE my_prod_table

Reprodukce modelu ML

V případě případů použití strojového učení můžete chtít archivovat verzi tabulky, která byla použita k trénování modelu ML. Budoucí modely je možné testovat pomocí této archivované datové sady. Chcete-li archivovat verzi datové sady pomocí CLONE, postupujte takto:

Pokud chcete například archivovat verzi tabulky použitou k trénování modelu ve verzi 15:

CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15

Krátkodobé experimenty v produkční tabulce

Pokud chcete otestovat pracovní postup v produkční tabulce bez poškození tabulky, vytvořte mělký klon. Mělké klony umožňují spouštět úlohy v naklonované tabulce, která odkazuje na všechna produkční data, ale nemá vliv na žádné produkční úlohy.

Vytvořte mělký klon produkční tabulky:

CREATE TABLE my_test SHALLOW CLONE my_prod_table;

Poznámka:

V Unity Catalogu nemůžete použít CREATE OR REPLACE k přepsání existujícího mělkého klonu. Použijte DROP TABLE následovaný CREATE TABLEnebo použijte nový název tabulky. Viz Omezení.

Spusťte aktualizace a ověřování na klonu:

UPDATE my_test WHERE user_id is null SET invalid=true;

Až budete připraveni, slučte změny zpět. Sloučení používá informace o aktualizacích v klonu k tomu, aby se tam, kde je to možné, omezilo pouze na změněné soubory:

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 *;

Po dokončení klon odstraňte:

DROP TABLE my_test;

Přepsání vlastností tabulky

Přepsání vlastností tabulky je užitečné pro:

  • Přidávání poznámek k tabulkám s informacemi vlastníka nebo uživatele při sdílení dat s různými organizačními jednotkami
  • Archivování tabulek Delta Lake, když je v archivu potřeba přístup k historickým verzím. Pro archivní tabulku můžete nezávisle zadat dobu uchovávání dat a protokolů. Příklad:

SQL

Pro tabulku Delta Lake:

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

Pro tabulku Iceberg:

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

Python

Rozhraní Python DeltaTable API je specifické pro 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

Rozhraní SCALA DeltaTable API je specifické pro 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)

Chování operace klonování pro starší metastore systému Hive

Important

V Databricks Runtime 13.3 LTS a novějších podporují spravované tabulky v Unity Catalog mělké klony. Chování klonování pro tabulky katalogu Unity se liší od chování klonování v jiných prostředích. Viz Shallow clone pro tabulky Unity Catalog.

U tabulky Delta Lake zaregistrované v metastoru Hive nebo v kolekci souborů, které nejsou zaregistrované jako tabulka, má klon následující chování:

  • Změny hlubokých nebo mělkých klonů nemají vliv na zdrojovou tabulku.
  • Mělké klony odkazují na datové soubory ve zdrojovém adresáři. Pokud spustíte VACUUM nad zdrojovou tabulkou, klienti už nebudou moct číst tyto datové soubory, což vyvolá chybu FileNotFoundException. Chcete-li provést opravu, spusťte klon s replace na mělkém klonu. Pokud k tomu dojde často, zvažte použití hloubkového klonu, který nezávisí na zdrojové tabulce.
  • Hloubkové klony nezávisí na zdrojové tabulce, ale jejich vytvoření je nákladné, protože kopírují data i metadata.
  • Klonování pomocí replace do cíle, který už v daném umístění obsahuje tabulku, vytvoří Delta log, pokud ještě neexistuje. Spuštěním VACUUM vyčistíte všechna existující data.
  • U existujících tabulek Delta Lake vytvoří klonování nový přírůstkový zápis, který obsahuje pouze nová metadata a data ze zdrojové tabulky od posledního klonování.
  • Klonování tabulky se liší od Create Table As Select (CTAS). Klon kromě dat zkopíruje metadata zdrojové tabulky. Nemusíte zadávat dělení, formát, invarianty, nullability ani jiná nastavení.
  • Klonovaná tabulka má nezávislou historii ze zdrojové tabulky. Dotazy na časovou cestu na klonované tabulce nefungují se stejnými vstupy jako ve zdrojové tabulce.