Klonen einer Tabelle in Azure Databricks
Mit dem Befehl clone
können Sie eine Kopie einer vorhandenen Delta Lake-Tabelle in Azure Databricks mit einer bestimmten Version erstellen. Klone können entweder tief oder flach sein.
Azure Databricks unterstützt auch das Klonen von Parquet- und Iceberg-Tabellen. Siehe Inkrementelles Klonen von Parquet- und Iceberg-Tabellen zu Delta Lake.
Ausführliche Informationen zur Verwendung eines Klons mit Unity Catalog finden Sie unter Flache Klone für Unity Catalog-Tabellen.
Hinweis
Databricks empfiehlt die Verwendung von Delta Sharing, um schreibgeschützten Zugriff auf Tabellen in unterschiedlichen Organisationen bereitzustellen. Weitere Informationen finden Sie unter Was ist Delta Sharing?.
Klontypen
- Ein tiefer Klon ist ein Klon, der die Quelltabellendaten – zusätzlich zu den Metadaten der vorhandenen Tabelle – in das Klonziel kopiert. Darüber hinaus werden Stream-Metadaten auch so geklont, dass ein Stream, der in die Delta-Tabelle schreibt, für eine Quelltabelle beendet und auf dem Ziel des Klons fortgesetzt werden kann, von dem aus er unterbrochen wurde.
- Ein flacher Klon ist ein Klon, der die Datendateien nicht in das Klonziel kopiert. Die Tabellen-Metadaten entsprechen der Quelle. Diese Klone lassen sich kostengünstiger erstellen.
Zu den geklonten Metadaten gehören: Schema, Partitionierungsinformationen, Invarianten, NULL-Zulässigkeit. Nur bei tiefen Klonen werden „stream“- und COPY INTO-Metadaten ebenfalls geklont. Nicht geklonte Metadaten sind die Tabellenbeschreibung und benutzerdefinierte Commit-Metadaten.
Wie sieht die Semantik von Delta-Klonvorgängen aus?
Wenn Sie mit einer Delta-Tabelle, die im Hive-Metastore registriert ist, oder mit einer Sammlung von Dateien arbeiten, die nicht als Tabelle registriert sind, hat der Klon die folgende Semantik:
Wichtig
In Databricks Runtime 13.3 LTS und höher verfügen verwaltete Unity Catalog-Tabellen über Unterstützung für unechte Klone. Die Klonsemantik für Unity Catalog-Tabellen unterscheidet sich erheblich von der Delta Lake-Klonsemantik in anderen Umgebungen. Weitere Informationen finden Sie unter Flache Klone für verwaltete Unity Catalog-Tabellen.
- An tiefen oder flachen Klonen vorgenommene Änderungen wirken sich nur auf die Klone selbst und nicht auf die Quelltabelle aus.
- Flache Klone verweisen auf Datendateien im Quellverzeichnis. Wenn Sie
vacuum
für die Quelltabelle ausführen, können Clients die Datendateien, auf die verwiesen wird, nicht mehr lesen, und eine Ausnahme des TypsFileNotFoundException
(Datei nicht gefunden) wird ausgelöst. In diesem Fall repariert das Ausführen des Klons mit einer Ersetzung des unechten Klons den Klon. Wenn das oft vorkommt, sollten Sie stattdessen einen tiefen Klon verwenden, der von der Quelltabelle nicht abhängig ist. - Tiefe Klone sind nicht abhängig von der Quelle, aus der sie geklont wurden. Ihre Erstellung ist aber teuer, weil ein tiefer Klon die Daten sowie die Metadaten kopiert.
- Beim Klonen mit
replace
zu einem Ziel, an dem es bereits eine Tabelle unter diesem Pfad gibt, wird ein Delta-Protokoll erstellt, wenn unter diesem Pfad noch keins vorhanden ist. Sie können alle vorhandenen Daten bereinigen, indem Sievacuum
ausführen. - Für vorhandene Delta-Tabellen wird ein neuer Commit erstellt, der die neuen Metadaten und neuen Daten aus der Quelltabelle enthält. Dieser neue Commit ist inkrementell, das heißt, es werden nur neue Änderungen seit dem letzten Klon in die Tabelle committet.
- Das Klonen einer Tabelle ist nicht identisch mit
Create Table As Select
oderCTAS
. Ein Klon kopiert die Metadaten der Quelltabelle zusätzlich zu den Daten. Das Klonen bietet auch eine einfachere Syntax: Sie müssen keine Partitionierung, kein Format, keine Invarianten, keine NULL-Zulässigkeit usw. angeben, da diese Werte aus der Quelltabelle entnommen werden. - Eine geklonte Tabelle hat einen unabhängigen Verlauf gegenüber ihrer Quelltabelle. Zeitreiseabfragen für eine geklonte Tabelle funktionieren nicht mit denselben Eingaben wie bei deren Quelltabelle.
Beispiel für Klonsyntax
Die folgenden Codebeispiele veranschaulichen die Syntax zum Erstellen von tiefen und flachen Klonen:
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
Details zur Syntax finden Sie unter CREATE TABLE CLONE.
Klonmetriken
CLONE
meldet die folgenden Metriken als einzeiligen Datenrahmen (DataFrame), sobald der Vorgang abgeschlossen ist:
source_table_size
: Größe in Bytes der zurzeit geklonten Quelltabelle.source_num_of_files
: Anzahl von Dateien in der Quelltabelle.num_removed_files
: Gibt an, wie viele Dateien bei einer Ersetzung der Tabelle aus der aktuellen Tabelle entfernt werden.num_copied_files
: Anzahl von Dateien, die aus der Quelle kopiert wurden („0“ für flache Klone).removed_files_size
: Größe in Bytes der Dateien, die aus der aktuellen Tabelle entfernt werden.copied_files_size
: Größe in Bytes der in die Tabelle kopierten Dateien.
Berechtigungen
Sie müssen Berechtigungen für Azure Databricks-Tabellenzugriffssteuerung und Ihren Cloudanbieter konfigurieren.
Zugriffssteuerung für Tabellen
Die folgenden Berechtigungen sind sowohl für tiefe als auch für flache Klone erforderlich:
SELECT
-Berechtigung für die Quelltabelle.- Wenn Sie mithilfe von
CLONE
eine neue Tabelle erstellen, müssen SieCREATE
-Berechtigung für die Datenbank haben, in der Sie die Tabelle erstellen. - Wenn Sie mithilfe von
CLONE
eine Tabelle ersetzen, müssen SieMODIFY
-Berechtigung für die Tabelle haben.
Cloudanbieterberechtigungen
Wenn Sie einen tiefen Klon erstellt haben, muss jeder Benutzer, der diesen Klon liest, Lesezugriff auf dessen Verzeichnis haben. Um Änderungen am Klon vornehmen zu können, müssen Benutzer Schreibzugriff auf dessen Verzeichnis haben.
Wenn Sie einen flachen Klon erstellt haben, benötigt jeder Benutzer, der diesen Klon liest, die Berechtigung zum Lesen der Dateien in der ursprünglichen Tabelle, da die Datendateien in der Quelltabelle mit flachen Klonen sowie im Verzeichnis des Klons verbleiben. Um Änderungen am Klon vornehmen zu können, benötigen Benutzer Schreibzugriff auf dessen Verzeichnis.
Verwenden des Klons für die Datenarchivierung
Sie können einen tiefen Klon erstellen, um den Zustand einer Tabelle zu einem bestimmten Zeitpunkt für Archivierungszwecke beizubehalten. Sie können tiefe Klone inkrementell synchronisieren, um einen aktualisierten Zustand einer Quelltabelle für die Notfallwiederherstellung beizubehalten.
-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
Verwenden des Klons für die ML-Modellreplizierung
Bei der Durchführung von maschinellem Lernen möchten Sie möglicherweise eine bestimmte Version einer Tabelle archivieren, für die Sie ein ML-Modell trainiert haben. Zukünftige Modelle können mithilfe dieses archivierten Datasets getestet werden.
-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Verwenden des Klons für kurzfristige Experimente bei einer Produktionstabelle
Wenn Sie einen Workflow bei einer Produktionstabelle testen möchten, ohne die Tabelle zu beschädigen, können Sie auf einfache Weise einen flachen Klon erstellen. Dadurch können Sie beliebige Workflows bei der geklonten Tabelle ausführen, die alle Produktionsdaten enthält, sich aber nicht auf Produktionsworkloads auswirkt.
-- 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;
Verwenden des Klons zum Außerkraftsetzen von Tabelleneigenschaften
Außerkraftsetzungen von Tabelleneigenschaften sind für Folgendes besonders nützlich:
- Kommentieren von Tabellen mit Besitzer- oder Benutzerinformationen bei der Freigabe von Daten für verschiedene Geschäftseinheiten.
- Die Archivierung von Delta-Tabellen und Tabellenverlauf oder Zeitreise ist erforderlich. Sie können die Daten- und Protokollaufbewahrungsdauer unabhängig für die Archivtabelle angeben. Beispiel:
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)