Klona en tabell i Azure Databricks
Du kan skapa en kopia av en befintlig Delta Lake-tabell i Azure Databricks i en viss version med hjälp av clone
kommandot . Kloner kan vara antingen djupa eller grunda.
Azure Databricks stöder också kloning av Parquet- och Iceberg-tabeller. Se Stegvis klona parquet- och isbergstabeller till Delta Lake.
Mer information om hur du använder klon med Unity Catalog finns i Shallow clone for Unity Catalog tables (Grund klon för Unity Catalog-tabeller).
Kommentar
Databricks rekommenderar att deltadelning används för att ge skrivskyddad åtkomst till tabeller i olika organisationer. Se Vad är deltadelning?.
Klontyper
- En djup klon är en klon som kopierar källtabelldata till klonmålet utöver metadata för den befintliga tabellen. Dessutom klonas även dataströmmetadata så att en ström som skriver till Delta-tabellen kan stoppas i en källtabell och fortsätta på målet för en klon där den slutade.
- En ytlig klon är en klon som inte kopierar datafilerna till klonmålet. Tabellmetadata motsvarar källan. Dessa kloner är billigare att skapa.
Metadata som klonas innehåller: schema, partitioneringsinformation, invarianter, nullabilitet. Endast för djupa kloner klonas även dataströmmen och COPY INTO-metadata . Metadata som inte klonas är tabellbeskrivningen och användardefinierade incheckningsmetadata.
Vad är semantiken för deltaklonåtgärder?
Om du har arbetat med en Delta-tabell som är registrerad i Hive-metaarkivet eller en samling filer som inte har registrerats som en tabell, har klon följande semantik:
Viktigt!
I Databricks Runtime 13.3 LTS och senare har hanterade Unity Catalog-tabeller stöd för grunda kloner. Klonsemantik för Unity Catalog-tabeller skiljer sig avsevärt från Delta Lake-klonsemantik i andra miljöer. Se Ytlig klon för Unity Catalog-tabeller.
- Ändringar som görs i antingen djupa eller grunda kloner påverkar endast själva klonerna och inte källtabellen.
- Grunda kloner refererar till datafiler i källkatalogen. Om du kör
vacuum
på källtabellen kan klienterna inte längre läsa de refererade datafilerna och enFileNotFoundException
genereras. I det här fallet repareras klonen genom att köra klonen med ersätt över den grunda klonen. Om detta inträffar ofta bör du överväga att använda en djupkloning i stället som inte är beroende av källtabellen. - Djupa kloner beror inte på vilken källa de klonades från, men det är dyrt att skapa eftersom en djup klon kopierar data och metadata.
- Kloning med
replace
till ett mål som redan har en tabell på den sökvägen skapar en Delta-logg om en inte finns på den sökvägen. Du kan rensa befintliga data genom att köravacuum
. - För befintliga Delta-tabeller skapas en ny incheckning som innehåller nya metadata och nya data från källtabellen. Den här nya incheckningen är inkrementell, vilket innebär att endast nya ändringar sedan den senaste klonen checkas in i tabellen.
- Kloning av en tabell är inte samma som
Create Table As Select
ellerCTAS
. En klon kopierar metadata för källtabellen utöver data. Kloning har också enklare syntax: du behöver inte ange partitionering, format, invarianter, nullabilitet och så vidare när de hämtas från källtabellen. - En klonad tabell har en oberoende historik från källtabellen. Tidsresefrågor i en klonad tabell fungerar inte med samma indata som de fungerar i källtabellen.
Exempel på klonningssyntax
Följande kodexempel visar syntax för att skapa djupa och grunda kloner:
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
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
Syntaxinformation finns i SKAPA TABELLKLONING.
Klona mått
CLONE
rapporterar följande mått som en dataram på en rad när åtgärden är klar:
source_table_size
: Storleken på källtabellen som klonas i byte.source_num_of_files
: Antalet filer i källtabellen.num_removed_files
: Om tabellen ersätts, hur många filer som tas bort från den aktuella tabellen.num_copied_files
: Antal filer som kopierades från källan (0 för grunda kloner).removed_files_size
: Storlek i byte för de filer som tas bort från den aktuella tabellen.copied_files_size
: Storlek i byte för de filer som kopierats till tabellen.
Behörigheter
Du måste konfigurera behörigheter för åtkomstkontroll för Azure Databricks-tabeller och din molnleverantör.
Åtkomstkontroll för tabeller
Följande behörigheter krävs för både djupa och grunda kloner:
SELECT
behörighet i källtabellen.- Om du använder
CLONE
för att skapa en ny tabell,CREATE
behörighet på databasen där du skapar tabellen. - Om du använder
CLONE
för att ersätta en tabell måste du haMODIFY
behörighet för tabellen.
Behörigheter för molnleverantör
Om du har skapat en djup klon måste alla användare som läser den djupa klonen ha läsbehörighet till klonens katalog. Om du vill göra ändringar i klonen måste användarna ha skrivåtkomst till klonens katalog.
Om du har skapat en ytlig klon behöver alla användare som läser den grunda klonen behörighet att läsa filerna i den ursprungliga tabellen, eftersom datafilerna finns kvar i källtabellen med grunda kloner samt klonens katalog. För att göra ändringar i klonen behöver användarna skrivåtkomst till klonens katalog.
Använda klon för dataarkivering
Du kan använda djupkloning för att bevara tillståndet för en tabell vid en viss tidpunkt i arkiveringssyfte. Du kan synkronisera djupa kloner stegvis för att upprätthålla ett uppdaterat tillstånd för en källtabell för haveriberedskap.
-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
Använda klon för ML-modellreproduktion
När du gör maskininlärning kanske du vill arkivera en viss version av en tabell som du har tränat en ML-modell på. Framtida modeller kan testas med den här arkiverade datauppsättningen.
-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Använda klon för kortsiktiga experiment i en produktionstabell
Om du vill testa ett arbetsflöde i en produktionstabell utan att skada tabellen kan du enkelt skapa en ytlig klon. På så sätt kan du köra godtyckliga arbetsflöden i den klonade tabellen som innehåller alla produktionsdata, men som inte påverkar några produktionsarbetsbelastningar.
-- 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;
Använda klon för att åsidosätta tabellegenskaper
Åsidosättningar av tabellegenskap är särskilt användbara för:
- Kommentera tabeller med ägar- eller användarinformation när du delar data med olika affärsenheter.
- Arkivering av Delta-tabeller och tabellhistorik eller tidsresor krävs. Du kan ange data- och loggkvarhållningsperioder oberoende av varandra för arkivtabellen. Till exempel:
SQL
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
Python
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)