Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Klonen Sie eine Delta Lake- oder Apache Iceberg-Tabelle mit dem CLONE Befehl, um eine unabhängige Kopie in einer bestimmten Version zu erstellen. Deep Clones kopieren sowohl Daten als auch Metadaten. Flache Klonen kopieren nur Metadaten und verweisen auf die Quelldatendateien, wobei weniger Rechen- und Speicheraufwand als deep Clones verwendet wird.
Azure Databricks unterstützt auch das Klonen von Parquet- und Apache Iceberg-Tabellen. Siehe Inkrementelles Klonen von Parquet- und Apache-Iceberg-Tabellen in Delta Lake und Klonen einer verwalteten Iceberg-Tabelle.
Ausführliche Informationen zur Verwendung von Clone mit Unity Catalog finden Sie unter Shallow Clone für Unity Catalog-Tabellen.
Note
Databricks empfiehlt die Verwendung von OpenSharing, um schreibgeschützten Zugriff auf Tabellen in verschiedenen Organisationen bereitzustellen. Siehe Was ist OpenSharing?.
Klontypen
Die folgenden Klontypen sind verfügbar:
| Typ | SQL-Syntax | Description |
|---|---|---|
| Deep Clone |
CLONE oder DEEP CLONE |
Kopiert sowohl die Daten als auch die Metadaten aus der Quelltabelle in das Klonziel, einschließlich Datenstrommetadaten. Ein Datenstrom, der in die Quelltabelle schreibt, kann angehalten und anschließend auf dem Klonziel an der Stelle fortgesetzt werden, an der er angehalten wurde. |
| Flacher Klon | SHALLOW CLONE |
Kopiert nur die Metadaten aus der Quelltabelle in das Klonziel. Datendateien werden nicht kopiert. Flache Klonen sind günstiger zu erstellen, da der Vorgang weniger Rechenressourcen und Speicherplatz verwendet. |
Geklonte Metadaten umfassen: Schema, Partitionierungsinformationen, Invarianten, Nullierbarkeit und TBLPROPERTIES. Nur bei tiefen Klonen werden auch Stream- und COPY INTO-Metadaten geklont. Metadaten, die nicht geklont sind, sind die Tabellenbeschreibung, benutzerdefinierte Commit-Metadaten, Delta Lake-Tabellenverlauf und Unity-Katalogeigenschaften, z. B. Tags.
Note
Streaming-Tabellen und materialisierte Ansichten unterstützen CLONE nicht. Sie können keine Streaming-Tabelle oder materialisierte Ansicht als Quelle oder Ziel eines tiefen oder flachen Klons verwenden. Siehe Einschränkungen und Einschränkungen.
Klonmetriken
CLONE meldet die folgenden Metriken als einzeiligen Datenrahmen (DataFrame), sobald der Vorgang abgeschlossen ist:
-
source_table_size: Größe der Quelltabelle, die in Bytes geklont wird. -
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
CLONEverwenden, um eine neue Tabelle zu erstellen, benötigen SieCREATE-Berechtigungen für die Datenbank, in der Sie die Tabelle erstellen. - Wenn Sie mithilfe von
CLONEeine Tabelle ersetzen, müssen SieMODIFY-Berechtigung für die Tabelle haben.
Cloudanbieterberechtigungen
Leser eines Deep Clones benötigen Lesezugriff auf das Verzeichnis des Klons. Autoren benötigen Schreibzugriff auf das Verzeichnis des Klons.
Leser eines flachen Klons benötigen Lesezugriff sowohl auf die Datendateien der Quelltabelle als auch auf das Verzeichnis des Klons, da Datendateien in der Quelle verbleiben. Autoren benötigen Schreibzugriff auf das Verzeichnis des Klons.
Beispiele
Erstellen Sie tiefe oder flache Klone
In den folgenden Codebeispielen wird das Erstellen von tiefen und flachen Klonen veranschaulicht:
SQL
Eine tiefe Kopie erstellen:
CREATE TABLE target_table CLONE source_table;
Ersetzen Sie ein vorhandenes Ziel:
CREATE OR REPLACE TABLE target_table CLONE source_table;
Erstellen Sie einen vollständigen Klon oder überspringen Sie den Vorgang, wenn das Ziel bereits vorhanden ist:
CREATE TABLE IF NOT EXISTS target_table CLONE source_table;
Erstellen Sie einen flachen Klon in der neuesten Version, in einer bestimmten Version oder zu einem bestimmten Zeitstempel. Der Zeitstempel kann eine Datumszeichenfolge wie '2019-01-01' oder ein Ausdruck wie date_sub(current_date(), 1) sein.
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
Die Python-API DeltaTable ist spezifisch für Delta Lake.
Klonen Sie die Quelle in der neuesten Version:
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=True, replace=False)
Die Quelle in einer bestimmten Version klonen:
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False)
Klonen Sie die Quelle zu einem bestimmten Zeitstempel:
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)
Scala
Die Scala-API DeltaTable ist spezifisch für Delta Lake.
Klonen Sie die Quelle in der neuesten Version:
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=true, replace=false)
Die Quelle in einer bestimmten Version klonen:
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false)
Klonen Sie die Quelle zu einem bestimmten Zeitstempel:
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false)
Ausführliche Informationen zur Syntax finden Sie unter CREATE TABLE CLONE.
Überprüfen der während des Kopierens kopierten Metadaten CLONE
Dieses Beispiel zeigt, welche Metadaten bei CLONE-Vorgängen kopiert werden und welche nicht, insbesondere TBLPROPERTIES, Unity Catalog-Tags und den Delta Lake-Verlauf.
Erstellen Sie eine Quelltabelle mit einer benutzerdefinierten Eigenschaft und einer nicht standardmäßigen Protokollaufbewahrungsdauer, und fügen Sie dann Daten ein, um den Tabellenverlauf zu generieren:
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');
Erstellen Sie einen tiefen Klon und einen flachen Klon:
CREATE OR REPLACE TABLE test_clone_deep DEEP CLONE test_clone_source;
CREATE TABLE test_clone_shallow SHALLOW CLONE test_clone_source;
Note
In Unity Catalog können Sie einen vorhandenen flachen Klon nicht mit CREATE OR REPLACE überschreiben. Verwenden Sie DROP TABLE, gefolgt von CREATE TABLE, oder verwenden Sie einen neuen Tabellennamen. Informationen finden Sie unter Einschränkungen.
Vergewissern Sie sich, dass TBLPROPERTIES auf beide Klone kopiert werden:
SHOW TBLPROPERTIES test_clone_source;
SHOW TBLPROPERTIES test_clone_deep;
SHOW TBLPROPERTIES test_clone_shallow;
Vergewissern Sie sich, dass Unity Catalog-Tags nicht auf Klone kopiert werden:
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';
Vergewissern Sie sich, dass der Delta Lake-Verlauf nicht auf Klone kopiert wird:
DESCRIBE HISTORY test_clone_source;
DESCRIBE HISTORY test_clone_deep;
DESCRIBE HISTORY test_clone_shallow;
Aufräumen:
DROP TABLE IF EXISTS test_clone_shallow;
DROP TABLE IF EXISTS test_clone_source;
DROP TABLE IF EXISTS test_clone_deep;
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.
Führen Sie einmal im Monat den folgenden Befehl aus, um das Archiv zu synchronisieren:
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
ML-Modellreproproduktion
Bei Anwendungsfällen für maschinelles Lernen möchten Sie möglicherweise eine Version einer Tabelle archivieren, die zum Trainieren eines ML-Modells verwendet wurde. Zukünftige Modelle können mit diesem archivierten Dataset getestet werden. Gehen Sie wie folgt vor, um eine Datasetversion mit CLONEarchivieren zu können:
Um beispielsweise die Version einer Tabelle zu archivieren, die zum Trainieren eines Modells in Version 15 verwendet wird:
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Kurzfristige Experimente auf einer Produktionstabelle
Wenn Sie einen Workflow auf einer Produktionstabelle testen möchten, ohne die Tabelle zu beschädigen, erstellen Sie einen flachen Klon. Mit flachen Klonen können Sie Workloads auf der geklonten Tabelle ausführen, die auf sämtliche Produktionsdaten verweist, ohne jedoch Produktions-Workloads zu beeinträchtigen.
Erstellen Sie einen flachen Klon der Produktionstabelle:
CREATE TABLE my_test SHALLOW CLONE my_prod_table;
Note
In Unity Catalog können Sie einen vorhandenen flachen Klon nicht mit CREATE OR REPLACE überschreiben. Verwenden Sie DROP TABLE, gefolgt von CREATE TABLE, oder verwenden Sie einen neuen Tabellennamen. Informationen finden Sie unter Einschränkungen.
Führen Sie Updates und Überprüfungen auf dem Klon aus:
UPDATE my_test WHERE user_id is null SET invalid=true;
Wenn Sie soweit sind, führen Sie die Änderungen wieder zusammen. Bei der Zusammenführung werden Aktualisierungsinformationen im Klon verwendet, um nach Möglichkeit nur geänderte Dateien zu löschen:
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 *;
Legen Sie den Klon nach Abschluss des Vorgangs ab:
DROP TABLE my_test;
Außerkraftsetzen von Tabelleneigenschaften
Außerkraftsetzungen von Tabelleneigenschaften sind nützlich für:
- Tabellen mit Besitzer- oder Benutzerinformationen kommentieren, wenn Daten mit verschiedenen Geschäftseinheiten geteilt werden.
- Archivieren von Delta Lake-Tabellen, wenn Sie Zeitreisen im Archiv benötigen. Sie können Daten- und Protokollaufbewahrungszeiträume unabhängig für die Archivtabelle angeben. Beispiel:
SQL
Für eine Delta Lake-Tabelle:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
Für eine Iceberg-Tabelle:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)
Python
Die Python DeltaTable-API ist Delta Lake-spezifisch.
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
Die Scala DeltaTable-API ist Delta Lake-spezifisch.
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)
Klonvorgangsverhalten für legacy-Hive-Metastore
Von Bedeutung
Ab Databricks Runtime 13.3 LTS unterstützen vom Unity Catalog verwaltete Tabellen flache Klone. Das Klonverhalten für Unity Catalog-Tabellen unterscheidet sich von klonenverhalten in anderen Umgebungen. Siehe Shallow Clone für Unity Catalog-Tabellen.
Für eine Delta Lake-Tabelle, die im Hive-Metaspeicher registriert ist, oder eine Sammlung von Dateien, die nicht als Tabelle registriert sind, weist klonen die folgenden Verhaltensweisen auf:
- Änderungen an tiefen oder flachen Klonen wirken sich nicht auf die Quelltabelle aus.
- Flache Klone verweisen auf Datendateien im Quellverzeichnis. Wenn Sie
VACUUMfür die Quelltabelle ausführen, können Clients diese Datendateien nicht mehr lesen, und dies führt zu einemFileNotFoundException. Führen Sie zum Reparieren clone mitreplaceauf dem flachen Klon aus. Wenn dies häufig der Fall ist, sollten Sie einen Deep Clone verwenden, der nicht von der Quelltabelle abhängt. - Deep Clones hängen nicht von der Quelltabelle ab, sind aber teuer zu erstellen, da sie sowohl die Daten als auch die Metadaten kopieren.
- Beim Klonen mit
replacein ein Ziel, das unter diesem Pfad bereits eine Tabelle enthält, wird ein Delta-Protokoll erstellt, falls noch keines vorhanden ist. Führen SieVACUUMaus, um vorhandene Daten zu entfernen. - Bei vorhandenen Delta Lake-Tabellen erstellt Kloning einen neuen inkrementellen Commit, der nur neue Metadaten und Daten aus der Quelltabelle seit dem letzten Klon enthält.
- Das Klonen einer Tabelle unterscheidet sich von
Create Table As Select(CTAS). Ein Klon kopiert zusätzlich zu den Daten die Metadaten der Quelltabelle. Sie müssen keine Partitionierung, Format, Invarianten, Nullierbarkeit oder andere Einstellungen angeben. - Eine geklonte Tabelle hat einen unabhängigen Verlauf gegenüber ihrer Quelltabelle. Zeitreiseabfragen in einer geklonten Tabelle funktionieren nicht mit den gleichen Eingaben wie in der Quelltabelle.