Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pomocí příkazu vytvořte kopii existující tabulky v Azure Databricks v konkrétní verzi clone . Klony můžou být hluboké nebo mělké.
Azure Databricks také podporuje klonování tabulek Parquet a Apache Iceberg. Viz přírůstkové klonování tabulek Parquet a Apache Iceberg do Delta Lake.
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 funkci Delta Sharing k poskytování přístupu k tabulkám jen pro čtení v různých organizacích. Podívejte se na Co je Delta Sharing?
Typy klonů
- Hloubkový klon je klon, který kromě metadat existující tabulky kopíruje data zdrojové tabulky do cílového úložiště klonování. Struktura metadat datových proudů je také klonována tak, aby operaci datového proudu, který zapisuje do tabulky Delta, bylo možné zastavit na zdrojové tabulce a pokračovat v cílové tabulce klonu od místa, kde byla operace přerušena.
- Mělký klon je klon, který nekopíruje datové soubory do cílového místa klonování. Metadata tabulky jsou ekvivalentní zdroji. Tyto klony jsou levnější k vytvoření.
Metadata klonovaná zahrnují: schéma, informace o dělení, invarianty a nulovost. Pouze pro hluboké klony se naklonují také metadata datových proudů a COPY INTO. Metadata, která nejsou naklonována, jsou popis tabulky a uživatelsky definovaná metadata potvrzení změn.
Jaké jsou sémantika operací klonování Delta?
Pokud pracujete s tabulkou Delta zaregistrovanou v metastoru Hive nebo kolekcí souborů, které nejsou zaregistrované jako tabulka, klon má následující sémantiku:
Důležité
V Databricks Runtime 13.3 LTS a novějších mají spravované tabulky Katalogu Unity podporu pro mělké klony. Sémantika klonování pro tabulky katalogu Unity se liší od sémantiky klonování v jiných prostředích. Viz Mělké klonování pro tabulky katalogu Unity.
- Jakékoli změny provedené v hlubokých nebo mělkých klonech ovlivní pouze samotné klony, nikoli zdrojovou tabulku.
- Mělké klony odkazují na datové soubory ve zdrojovém adresáři. Pokud spustíte
vacuumna zdrojové tabulce, klienti už nebudou moct číst odkazované datové soubory aFileNotFoundExceptionje vyvolána. V tomto případě spuštění funkce clone s příkazem replace nad mělkým klonem zlepší funkčnost klonu. Pokud k tomu dochází často, zvažte použití hloubkového klonu, který nezávisí na zdrojové tabulce. - Hloubkové klony nezávisí na zdroji, ze kterého byly klonovány, ale jejich vytvoření je nákladné, protože hloubkový klon kopíruje data i metadata.
- Klonování s použitím
replacena cíl, který již obsahuje tabulku na této cestě, vytvoří protokol Delta, pokud takový protokol na této cestě neexistuje. Spuštěním příkazuvacuummůžete vyčistit všechna existující data. - Pro existující tabulky Delta se vytvoří nové potvrzení, které obsahuje nová metadata a nová data ze zdrojové tabulky. Tento nový commit je inkrementální, což znamená, že do tabulky jsou zaznamenány pouze nové změny od posledního klonování.
- Klonování tabulky není stejné jako
Create Table As SelectneboCTAS. Klon zkopíruje metadata zdrojové tabulky kromě dat. Klonování má také jednodušší syntaxi: nemusíte zadávat dělení, formát, invarianty, nulovost atd., protože jsou převzaty ze zdrojové tabulky. - Klonovaná tabulka má nezávislou historii ze zdrojové tabulky. Dotazy na časovou cestu na klonované tabulce nefungují se stejnými vstupy jako u zdrojové tabulky.
Příklad syntaxe klonování
Následující příklady kódu ukazují syntaxi pro vytváření hlubokých a mělkých klonů:
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)
Python
Rozhraní Python DeltaTable API je specifické pro Delta Lake.
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
Rozhraní SCALA DeltaTable API je specifické pro Delta Lake.
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
Podrobnosti o syntaxi najdete v sekci CREATE TABLE CLONE.
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.
Oprávnění
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í:
-
SELECToprávnění ke zdrojové tabulce. - Pokud k vytvoření nové tabulky používáte
CLONE, oprávnění k databázi,CREATEve které vytváříte tabulku. - Pokud k nahrazení tabulky používáte
CLONE, musíte mítMODIFYoprávnění k tabulce.
Oprávnění poskytovatele cloudu
Pokud jste vytvořili hluboký klon, každý uživatel, který čte tento klon, musí mít přístup pro čtení k adresáři klonu. Aby uživatelé mohli provádět změny klonu, musí mít přístup k zápisu do adresáře klonu.
Pokud jste vytvořili mělký klon, musí každý uživatel, který přečte mělký klon, oprávnění ke čtení souborů v původní tabulce, protože datové soubory zůstávají ve zdrojové tabulce s mělkými klony a adresářem klonu. Aby uživatelé mohli provádět změny klonu, budou potřebovat přístup k zápisu do adresáře klonu.
Použití klonování pro archivaci 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.
-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
Použití klonování pro reprodukci modelu ML
Při strojovém učení můžete chtít archivovat určitou verzi tabulky, na které jste vytrénovali model ML. Budoucí modely je možné testovat pomocí této archivované datové sady.
-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Použijte klon pro krátkodobé experimenty v produkční tabulce
Pokud chcete otestovat pracovní postup v produkční tabulce bez poškození tabulky, můžete snadno vytvořit mělký klon. To umožňuje spouštět libovolné pracovní postupy v klonované tabulce, která obsahuje všechna produkční data, ale nemá vliv na žádné produkční úlohy.
-- 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;
Použijte klonování k přepsání vlastností tabulky
Přepsání vlastností tabulky je zvlášť 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
- Archivace tabulek Delta a historie či časového cestování tabulek je vyžadována. Data a doby uchovávání protokolů můžete zadat nezávisle na archivační tabulce. Příklad:
SQL
-- For Delta tables
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
-- For Iceberg tables
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)