Příkazy tabulkových nástrojů

Rozdílové tabulky podporují několik příkazů nástrojů.

Odebrat soubory, na které se už neodkazuje v tabulce rozdílů

Můžete odebrat soubory, na které již není odkazováno rozdílovou tabulkou a které jsou starší než prahová hodnota vacuum pro uchování spuštěním příkazu v tabulce. vacuum se neaktivuje automaticky. Výchozí prahová hodnota pro uchování souborů je 7 dní.

Důležité

  • vacuum odstraní pouze datové soubory, nikoli soubory protokolu. Soubory protokolu jsou po operaci kontrolního bodu odstraněny automaticky a asynchronně. Výchozí doba uchování souborů protokolu je 30 dní, lze ji konfigurovat prostřednictvím delta.logRetentionDuration vlastnosti, kterou jste nastavili pomocí ALTER TABLE SET TBLPROPERTIES metody SQL. Viz Vlastnosti tabulky.
  • Po spuštění se ztratí schopnost přejít zpět na verzi , která je starší než doba uchování vacuum .

SQL

VACUUM eventsTable   -- vacuum files not required by versions older than the default retention period

VACUUM '/data/events' -- vacuum files in path-based table

VACUUM delta.`/data/events/`

VACUUM delta.`/data/events/` RETAIN 100 HOURS  -- vacuum files not required by versions more than 100 hours old

VACUUM eventsTable DRY RUN    -- do dry run to get the list of files to be deleted

Podrobnosti o syntaxi Spark SQL najdete v tématu.

  • Databricks Runtime 7. x a vyšší: podtlak
  • Databricks Runtime 5,5 LTS a 6. x: podtlak

Python

Poznámka

Rozhraní Python API je dostupné v Databricks Runtime 6,1 a novějších.

from delta.tables import *

deltaTable = DeltaTable.forPath(spark, pathToTable)  # path-based tables, or
deltaTable = DeltaTable.forName(spark, tableName)    # Hive metastore-based tables

deltaTable.vacuum()        # vacuum files not required by versions older than the default retention period

deltaTable.vacuum(100)     # vacuum files not required by versions more than 100 hours old

Scala

Poznámka

Rozhraní Scala API je dostupné v Databricks Runtime 6,0 a novějších.

import io.delta.tables._

val deltaTable = DeltaTable.forPath(spark, pathToTable)

deltaTable.vacuum()        // vacuum files not required by versions older than the default retention period

deltaTable.vacuum(100)     // vacuum files not required by versions more than 100 hours old

Java

Poznámka

Rozhraní Java API je dostupné v Databricks Runtime 6,0 a novějších.

import io.delta.tables.*;
import org.apache.spark.sql.functions;

DeltaTable deltaTable = DeltaTable.forPath(spark, pathToTable);

deltaTable.vacuum();        // vacuum files not required by versions older than the default retention period

deltaTable.vacuum(100);     // vacuum files not required by versions more than 100 hours old

Podrobnosti o syntaxi Scala, Java a Pythonu najdete v referenčních informacích k rozhraní Lake Lake API .

Upozornění

Nedoporučujeme, abyste nastavili interval uchovávání kratší než 7 dní, protože staré a nepotvrzené soubory můžou pořád používat souběžné čtenáři nebo zapisovače do tabulky. Pokud vacuum vyčistí aktivní soubory, můžou se souběžné čtecí zařízení podařit nebo může dojít ke poškození tabulek při vacuum odstraňování souborů, které ještě nebyly potvrzené.

Rozdílový Lake má bezpečnostní kontrolu, která znemožňuje spuštění nebezpečného vacuum příkazu. Pokud jste si jisti, že v této tabulce nejsou žádné operace, které mají delší dobu než interval uchování, který chcete zadat, můžete tuto kontrolu bezpečnosti vypnout nastavením vlastnosti konfigurace Apache Spark spark.databricks.delta.retentionDurationCheck.enabled na false . Je nutné zvolit interval, který je delší než nejdelší běžící souběžná transakce, a nejdelší dobu, kterou může libovolný datový proud při zpoždění za poslední aktualizací tabulky.

Informace o auditu

VACUUM potvrzení do protokolu rozdílové transakce obsahují informace o auditu. Můžete zadat dotaz na události auditu pomocí DESCRIBE HISTORY .

Načíst historii rozdílových tabulek

Můžete načíst informace o operacích, uživateli, časovém razítku a tak dále pro každý zápis do tabulky rozdílů spuštěním history příkazu. Operace se vrátí v opačném chronologickém pořadí. Ve výchozím nastavení se historie tabulky uchovává po dobu 30 dnů.

SQL

DESCRIBE HISTORY '/data/events/'          -- get the full history of the table

DESCRIBE HISTORY delta.`/data/events/`

DESCRIBE HISTORY '/data/events/' LIMIT 1  -- get the last operation only

DESCRIBE HISTORY eventsTable

Podrobnosti o syntaxi Spark SQL najdete v tématu.

Python

Poznámka

Rozhraní Python API je dostupné v Databricks Runtime 6,1 a novějších.

from delta.tables import *

deltaTable = DeltaTable.forPath(spark, pathToTable)

fullHistoryDF = deltaTable.history()    # get the full history of the table

lastOperationDF = deltaTable.history(1) # get the last operation

Scala

Poznámka

Rozhraní Scala API je dostupné v Databricks Runtime 6,0 a novějších.

import io.delta.tables._

val deltaTable = DeltaTable.forPath(spark, pathToTable)

val fullHistoryDF = deltaTable.history()    // get the full history of the table

val lastOperationDF = deltaTable.history(1) // get the last operation

Java

Poznámka

Rozhraní Java API je dostupné v Databricks Runtime 6,0 a novějších.

import io.delta.tables.*;

DeltaTable deltaTable = DeltaTable.forPath(spark, pathToTable);

DataFrame fullHistoryDF = deltaTable.history();       // get the full history of the table

DataFrame lastOperationDF = deltaTable.history(1);    // fetch the last operation on the DeltaTable

Podrobnosti syntaxe Scala/Java/Python najdete v referenčních informacích o rozdílových rozhraních Lake API .

Schéma historie

Výstup history operace má následující sloupce.

Sloupec Typ Popis
verze long Verze tabulky generovaná operací
časové razítko časové razítko Čas, kdy byla tato verze potvrzena.
userId řetězec ID uživatele, který operaci spustil.
userName řetězec Jméno uživatele, který spustil operaci.
operation řetězec Název operace
operationParameters mapa Parametry operace (například predikáty.)
úloha struct Podrobnosti úlohy, která spustila operaci.
poznámkový blok struct Podrobnosti poznámkového bloku, ze kterého byla operace spuštěna.
clusterId řetězec ID clusteru, na kterém byla operace spuštěna.
readVersion long Verze tabulky, která byla načtena k provedení operace zápisu.
isolationLevel řetězec Úroveň izolace použitá pro tuto operaci
isBlindAppend boolean Určuje, zda tato operace přidává data.
operationMetrics mapa Metriky operace (například počet změněných řádků a souborů)
userMetadata řetězec Uživatelsky definovaná metadata potvrzení, pokud byla zadána
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
|version|          timestamp|userId|userName|operation| operationParameters| job|notebook|clusterId|readVersion|   isolationLevel|isBlindAppend|    operationMetrics|
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
|      5|2019-07-29 14:07:47|   ###|     ###|   DELETE|[predicate -> ["(...|null|     ###|      ###|          4|WriteSerializable|        false|[numTotalRows -> ...|
|      4|2019-07-29 14:07:41|   ###|     ###|   UPDATE|[predicate -> (id...|null|     ###|      ###|          3|WriteSerializable|        false|[numTotalRows -> ...|
|      3|2019-07-29 14:07:29|   ###|     ###|   DELETE|[predicate -> ["(...|null|     ###|      ###|          2|WriteSerializable|        false|[numTotalRows -> ...|
|      2|2019-07-29 14:06:56|   ###|     ###|   UPDATE|[predicate -> (id...|null|     ###|      ###|          1|WriteSerializable|        false|[numTotalRows -> ...|
|      1|2019-07-29 14:04:31|   ###|     ###|   DELETE|[predicate -> ["(...|null|     ###|      ###|          0|WriteSerializable|        false|[numTotalRows -> ...|
|      0|2019-07-29 14:01:40|   ###|     ###|    WRITE|[mode -> ErrorIfE...|null|     ###|      ###|       null|WriteSerializable|         true|[numFiles -> 2, n...|
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+

Poznámka

Klíče metrik operací

historyOperace vrátí kolekci metrik operací v operationMetrics mapě sloupce.

V následujících tabulkách jsou uvedeny definice klíčů mapování podle operace.

Operace Název metriky Popis
ZAPSAT CREATE TABLE JAKO SELECT, NAHRADIT TABULKU JAKO SELECT, KOPÍROVAT DO
numFiles Počet zapsaných souborů
numOutputBytes Velikost zapsaného obsahu v bajtech.
numOutputRows Počet zapsaných řádků
AKTUALIZACE STREAMOVÁNÍ
numAddedFiles Počet přidaných souborů
numRemovedFiles Počet odebraných souborů
numOutputRows Počet zapsaných řádků
numOutputBytes Velikost zápisu v bajtech
DELETE
numAddedFiles Počet přidaných souborů Není k dispozici při odstranění oddílů v tabulce.
numRemovedFiles Počet odebraných souborů
numDeletedRows Počet odebraných řádků Není k dispozici při odstranění oddílů v tabulce.
numCopiedRows Počet řádků zkopírovaných během procesu odstraňování souborů.
ZKRÁTIT numRemovedFiles Počet odebraných souborů
SLOUČENÍ
numSourceRows Počet řádků ve zdrojovém dataframe.
numTargetRowsInserted Počet řádků vložených do cílové tabulky
numTargetRowsUpdated Počet aktualizovaných řádků v cílové tabulce.
numTargetRowsDeleted Počet odstraněných řádků v cílové tabulce
numTargetRowsCopied Počet zkopírovaných cílových řádků
numOutputRows Celkový počet zapsaných řádků
numTargetFilesAdded Počet souborů přidaných do jímky (cíl).
numTargetFilesRemoved Počet souborů odebraných z jímky (cíl).
UPDATE
numAddedFiles Počet přidaných souborů
numRemovedFiles Počet odebraných souborů
numUpdatedRows Počet aktualizovaných řádků
numCopiedRows Počet řádků, které jste právě zkopírovali během procesu aktualizace souborů.
FSCK numRemovedFiles Počet odebraných souborů
CONVERT numConvertedFiles Počet převedených souborů Parquet
Operace Název metriky Popis
KLONOVAT (1)
sourceTableSize Velikost v bajtech zdrojové tabulky ve verzi, která je klonována.
sourceNumOfFiles Počet souborů ve zdrojové tabulce ve verzi, která je klonována.
numRemovedFiles Počet souborů odebraných z cílové tabulky, pokud byla nahrazena předchozí tabulka Delta.
removedFilesSize Celková velikost v bajtech souborů odebraných z cílové tabulky, pokud byla nahrazena předchozí tabulka Delta.
numCopiedFiles Počet souborů, které byly zkopírovány do nového umístění. 0 pro neomezený klony.
copiedFilesSize Celková velikost souborů, které byly zkopírovány do nového umístění v bajtech. 0 pro neomezený klony.
OBNOVIT (2)
tableSizeAfterRestore Velikost tabulky v bajtech po obnovení
numOfFilesAfterRestore Počet souborů v tabulce po obnovení
numRemovedFiles Počet souborů odebraných operací obnovení.
numRestoredFiles Počet souborů, které byly přidány v důsledku obnovení.
removedFilesSize Velikost v bajtech souborů odebraných obnovením
restoredFilesSize Velikost v bajtech souborů přidaných obnovením
OPTIMIZE
numAddedFiles Počet přidaných souborů
numRemovedFiles Počet optimalizovaných souborů
numAddedBytes Počet bajtů přidaných po optimalizaci tabulky
numRemovedBytes Počet odebraných bajtů
minFileSize Velikost nejmenšího souboru po optimalizaci tabulky
p25FileSize Velikost souboru 25. percentilu po optimalizaci tabulky
p50FileSize Medián velikosti souboru po optimalizaci tabulky
p75FileSize Velikost souboru percentil percentilu po optimalizaci tabulky
maxFileSize Velikost největšího souboru po optimalizaci tabulky
VAKUa (3)
numDeletedFiles Počet odstraněných souborů.
numVacuumedDirectories Počet podtlakových adresářů
numFilesToDelete Počet souborů, které se mají odstranit

(1) vyžaduje DATABRICKS Runtime 7,3 LTS nebo vyšší.

(2) vyžaduje Databricks Runtime 7,4 nebo vyšší.

(3) vyžaduje Databricks runtime 8,2 nebo vyšší.

Načíst podrobnosti rozdílové tabulky

Můžete získat podrobné informace o rozdílové tabulce (například počet souborů, velikost dat) pomocí DESCRIBE DETAIL .

DESCRIBE DETAIL '/data/events/'

DESCRIBE DETAIL eventsTable

Podrobnosti o syntaxi Spark SQL najdete v tématu.

Schéma podrobností

Výstup této operace má pouze jeden řádek s následujícím schématem.

Sloupec Typ Popis
formát řetězec Formát tabulky, tj. "Delta".
id řetězec Jedinečné ID tabulky
name řetězec Název tabulky, jak je definován v metastore.
description řetězec Popis tabulky
location řetězec Umístění tabulky
createdAt časové razítko Při vytvoření tabulky
lastModified časové razítko Datum poslední změny tabulky
partitionColumns pole řetězců Názvy sloupců oddílů, pokud je tabulka rozdělená na oddíly.
numFiles long Počet souborů v nejnovější verzi tabulky
properties Mapa řetězcového řetězce Všechny vlastnosti nastavené pro tuto tabulku.
minReaderVersion int Minimální verze čtecího zařízení (podle protokolu protokolu), který může tabulku číst.
minWriterVersion int Minimální verze zapisovače (podle protokolu protokolu), který může zapisovat do tabulky.
+------+--------------------+------------------+-----------+--------------------+--------------------+-------------------+----------------+--------+-----------+----------+----------------+----------------+
|format|                  id|              name|description|            location|           createdAt|       lastModified|partitionColumns|numFiles|sizeInBytes|properties|minReaderVersion|minWriterVersion|
+------+--------------------+------------------+-----------+--------------------+--------------------+-------------------+----------------+--------+-----------+----------+----------------+----------------+
| delta|d31f82d2-a69f-42e...|default.deltatable|       null|file:/Users/tdas/...|2020-06-05 12:20:...|2020-06-05 12:20:20|              []|      10|      12345|        []|               1|               2|
+------+--------------------+------------------+-----------+--------------------+--------------------+-------------------+----------------+--------+-----------+----------+----------------+----------------+

Převod tabulky Parquet na rozdílovou tabulku

Převede tabulku Parquet na místo na rozdílové tabulce. Tento příkaz vypíše všechny soubory v adresáři, vytvoří rozdílový protokol transakcí Lake, který tyto soubory sleduje, a automaticky odvodí schéma dat, a to čtením zápatí všech souborů Parquet. Pokud jsou data rozdělená na oddíly, je nutné zadat schéma sloupců oddílu jako řetězec ve formátu DDL (tj <column-name1> <type>, <column-name2> <type>, ... .).

Poznámka

Pokud byla tabulka Parquet vytvořená strukturovaným datovým proudem, může se seznam souborů vyhnout použitím _spark_metadata podadresáře jako zdroje pravdy pro soubory obsažené v tabulce nastavení konfigurace SQL spark.databricks.delta.convert.useMetadataLog true .

SQL

-- Convert unpartitioned Parquet table at path '<path-to-table>'
CONVERT TO DELTA parquet.`<path-to-table>`

-- Convert partitioned Parquet table at path '<path-to-table>' and partitioned by integer columns named 'part' and 'part2'
CONVERT TO DELTA parquet.`<path-to-table>` PARTITIONED BY (part int, part2 int)

Podrobné informace o syntaxi naleznete v tématu.

Python

Poznámka

Rozhraní Python API je dostupné v Databricks Runtime 6,1 a novějších.

from delta.tables import *

# Convert unpartitioned Parquet table at path '<path-to-table>'
deltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`")

# Convert partitioned parquet table at path '<path-to-table>' and partitioned by integer column named 'part'
partitionedDeltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`", "part int")

Scala

Poznámka

Rozhraní Scala API je dostupné v Databricks Runtime 6,0 a novějších.

import io.delta.tables._

// Convert unpartitioned Parquet table at path '<path-to-table>'
val deltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`")

// Convert partitioned Parquet table at path '<path-to-table>' and partitioned by integer columns named 'part' and 'part2'
val partitionedDeltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`", "part int, part2 int")

Java

Poznámka

Rozhraní Scala API je dostupné v Databricks Runtime 6,0 a novějších.

import io.delta.tables.*;

// Convert unpartitioned Parquet table at path '<path-to-table>'
DeltaTable deltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`");

// Convert partitioned Parquet table at path '<path-to-table>' and partitioned by integer columns named 'part' and 'part2'
DeltaTable deltaTable = DeltaTable.convertToDelta(spark, "parquet.`<path-to-table>`", "part int, part2 int");

Poznámka

Libovolný soubor, který není sledován rozdílovým Lake, není viditelný a lze jej odstranit při spuštění vacuum . Během procesu převodu byste neměli aktualizovat nebo připojovat datové soubory. Po převedení tabulky zajistěte, aby všechny zápisy přešly přes rozdílový Lake.

Convert a Delta table to a Parquet table

Rozdílovou tabulku můžete snadno převést zpátky do tabulky Parquet pomocí následujících kroků:

  1. Pokud jste provedli operace rozdílového Lake, které mohou změnit datové soubory (například delete nebo merge ), spusťte podtlak s dobou uchování 0 hodin, aby se odstranily všechny datové soubory, které nepatří do poslední verze tabulky.
  2. Odstraňte _delta_log adresář v adresáři tabulky.

Obnovení rozdílové tabulky do dřívějšího stavu

Důležité

Tato funkce je ve verzi Public Preview.

Poznámka

K dispozici v Databricks Runtime 7,4 a novějších.

Rozdílovou tabulku můžete obnovit do předchozího stavu pomocí RESTORE příkazu. Rozdílová tabulka interně udržuje historické verze tabulky, které umožňují obnovení do dřívějšího stavu. Verze odpovídající dřívějšímu stavu nebo časovému razítku v době, kdy byl vytvořen předchozí stav, jsou podporovány jako možnosti RESTORE příkazu.

Důležité

  • Můžete obnovit již obnovenou tabulku a naklonované tabulky.
  • Obnovení tabulky do starší verze, kde byly datové soubory odstraněny ručně nebo vacuum dojde k chybě. Obnovení na tuto verzi je částečně možné i v případě spark.sql.files.ignoreMissingFiles , že je nastavená na true .
  • Formát časového razítka pro obnovení do předchozího stavu je yyyy-MM-dd HH:mm:ss . yyyy-MM-ddJe také podporováno poskytování pouze řetězce data ().

SQL

RESTORE TABLE db.target_table TO VERSION AS OF <version>
RESTORE TABLE delta.`/data/target/` TO TIMESTAMP AS OF <timestamp>

Python

from delta.tables import *

deltaTable = DeltaTable.forPath(spark, <path-to-table>)  # path-based tables, or
deltaTable = DeltaTable.forName(spark, <table-name>)    # Hive metastore-based tables

deltaTable.restoreToVersion(0) # restore table to oldest version

deltaTable.restoreToTimestamp('2019-02-14') # restore to a specific timestamp

Scala

import io.delta.tables._

val deltaTable = DeltaTable.forPath(spark, <path-to-table>)
val deltaTable = DeltaTable.forName(spark, <table-name>)

deltaTable.restoreToVersion(0) // restore table to oldest version

deltaTable.restoreToTimestamp("2019-02-14") // restore to a specific timestamp

Java

import io.delta.tables.*;

DeltaTable deltaTable = DeltaTable.forPath(spark, <path-to-table>);
DeltaTable deltaTable = DeltaTable.forName(spark, <table-name>);

deltaTable.restoreToVersion(0) // restore table to oldest version

deltaTable.restoreToTimestamp("2019-02-14") // restore to a specific timestamp

Podrobnosti o syntaxi najdete v tématu obnovení (Delta Lake na Azure Databricks).

Obnovit metriky

Poznámka

K dispozici v Databricks Runtime 8,2 a novějších.

RESTORE Po dokončení operace nahlásí následující metriky jako datový rámec s jedním řádkem:

  • table_size_after_restore: Velikost tabulky po obnovení.
  • num_of_files_after_restore: Počet souborů v tabulce po obnovení.
  • num_removed_files: Počet odebraných souborů (logicky odstraněný) z tabulky.
  • num_restored_files: Počet obnovených souborů z důvodu vrácení zpět.
  • removed_files_size: Celková velikost souborů, které jsou odebrány z tabulky, v bajtech.
  • restored_files_size: Celková velikost v bajtech obnovených souborů.

Příklad obnovení metrik

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

MODIFYPro obnovenou tabulku musíte mít oprávnění.

Klonovat rozdílovou tabulku

Poznámka

K dispozici v Databricks Runtime 7,2 a novějších.

Můžete vytvořit kopii existující rozdílové tabulky v konkrétní verzi pomocí clone příkazu. Klony mohou být buď hluboké, nebo omezené.

V této části:

Typy klonování

  • Hluboký klon je klon, který kopíruje data zdrojové tabulky do cíle klonování kromě metadat existující tabulky. Kromě toho jsou metadata služby Stream také klonována tak, aby datový proud, který zapisuje do tabulky Delta, mohl být zastaven ve zdrojové tabulce a pokračoval na cíli klonu, ze kterého byla vypnuta.
  • Neomezený klon je klon, který nekopíruje datové soubory do cíle klonování. Metadata tabulky jsou ekvivalentní zdroji. Vytváření těchto klonů je levnější.

Jakékoli změny provedené v hlubokých nebo neomezených klonech ovlivňují pouze klony samotné a nikoli zdrojové tabulky.

Naklonovaná metadata zahrnují: schéma, informace o dělení, invariantní a možnost použití hodnoty null. V případě hlubokých klonů jsou také naklonována metadata streamování a kopírování do (rozdílových Lake on Azure Databricks) . Metadata nejsou naklonovaná popisem tabulky a uživatelsky definovanými metadaty potvrzení.

Důležité

  • Neomezený klonují referenční datové soubory ve zdrojovém adresáři. Pokud spustíte vacuum na zdrojové tabulce, klienti již nebudou moci číst odkazované datové soubory a FileNotFoundException dojde k vyvolání. V takovém případě bude při spuštění klonu s neomezeným klonem potřeba klon opravit. Pokud k tomu dojde často, zvažte místo toho použití hlubokého klonu, který není závislý na zdrojové tabulce.
  • Hluboká klony nezávisí na zdroji, ze kterého byly naklonovány, ale jsou nákladné pro vytvoření, protože hluboká klon kopíruje data i metadata.
  • Klonování s cílem replace , který již má tabulku v této cestě, vytvoří rozdílový protokol, pokud v této cestě neexistuje. Existující data můžete vyčistit spuštěním vacuum . Pokud je stávající tabulka rozdílová tabulka, vytvoří se v existující tabulce Delta nové potvrzení, které obsahuje nová metadata a nová data ze zdrojové tabulky.
  • Klonování tabulky není stejné jako Create Table As Select nebo CTAS . Klon kopíruje kromě dat i metadata zdrojové tabulky. Klonování má také jednodušší syntaxi: nemusíte určovat dělení, formát, invariantní, možnost použití hodnoty null a tak dále, jak jsou pořízeny ze zdrojové tabulky.
  • Naklonovaná tabulka má nezávislou historii ze zdrojové tabulky. Čas cestovních dotazů na naklonované tabulce nebude fungovat se stejnými vstupy, jako pracují na zdrojové tabulce.

SQL

 CREATE TABLE delta.`/data/target/` CLONE delta.`/data/source/` -- Create a deep clone of /data/source at /data/target

 CREATE OR REPLACE TABLE db.target_table CLONE db.source_table -- Replace the target

 CREATE TABLE IF NOT EXISTS TABLE delta.`/data/target/` CLONE db.source_table -- No-op if the target table exists

 CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source`

 CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source` VERSION AS OF version

 CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source` 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.forPath(spark, pathToTable)  # path-based tables, or
 deltaTable = DeltaTable.forName(spark, tableName)    # Hive metastore-based tables

 deltaTable.clone(target, isShallow, replace) # clone the source at latest version

 deltaTable.cloneAtVersion(version, target, isShallow, replace) # clone the source at a specific version

# clone the source at a specific timestamp such as timestamp=“2019-01-01”
 deltaTable.cloneAtTimestamp(timestamp, target, isShallow, replace)

Scala

 import io.delta.tables._

 val deltaTable = DeltaTable.forPath(spark, pathToTable)
 val deltaTable = DeltaTable.forName(spark, tableName)

 deltaTable.clone(target, isShallow, replace) // clone the source at latest version

 deltaTable.cloneAtVersion(version, target, isShallow, replace) // clone the source at a specific version

 deltaTable.cloneAtTimestamp(timestamp, target, isShallow, replace) // clone the source at a specific timestamp

Java

 import io.delta.tables.*;

 DeltaTable deltaTable = DeltaTable.forPath(spark, pathToTable);
 DeltaTable deltaTable = DeltaTable.forName(spark, tableName);

 deltaTable.clone(target, isShallow, replace) // clone the source at latest version

 deltaTable.cloneAtVersion(version, target, isShallow, replace) // clone the source at a specific version

 deltaTable.cloneAtTimestamp(timestamp, target, isShallow, replace) // clone the source at a specific timestamp

Podrobnosti syntaxe najdete v tématu klonování (Delta Lake na Azure Databricks).

Klonovat metriky

Poznámka

K dispozici v Databricks Runtime 8,2 a novějších.

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

  • source_table_size: Velikost zdrojové tabulky, která je klonována 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 neomezený počet klonů).
  • removed_files_size: Velikost souborů, které jsou odebírány z aktuální tabulky, v bajtech.
  • copied_files_size: Velikost souborů zkopírovaných do tabulky v bajtech.

Příklad klonování metrik

Oprávnění

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

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

Pro hloubkové i omezené klonování se vyžadují následující oprávnění:

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

Oprávnění poskytovatele cloudu

Pokud jste vytvořili hluboký klon, musí mít každý uživatel, který má přímý klon, přístup pro čtení k adresáři klonu. Aby mohli uživatelé provádět změny klonu, musí mít k adresáři klonu oprávnění k zápisu.

Pokud jste vytvořili neomezený klon, každý uživatel, který přečte neomezený klon, potřebuje oprávnění ke čtení souborů v původní tabulce, protože datové soubory zůstávají ve zdrojové tabulce s omezenými duplicitami a také s adresářem klonu. Aby bylo možné provádět změny klonu, uživatelé budou potřebovat přístup pro zápis do adresáře klonování.

Klonovat případy použití

V této části:

Archivace dat

Data může být potřeba uchovávat déle, než je možné s časovou cestou nebo zotavením po havárii. V těchto případech můžete vytvořit hluboký klon, který zachovává stav tabulky v určitém časovém okamžiku pro archivaci. Přírůstková archivace také umožňuje průběžné aktualizace stavu zdrojové tabulky pro zotavení po havárii.

-- Every month run
CREATE OR REPLACE TABLE delta.`/some/archive/path` CLONE my_prod_table

Reprodukce toků strojového učení

Při provádění strojového učení budete chtít archivovat určitou verzi tabulky, na které jste vyškolený model ML. Budoucí modely lze testovat pomocí této archivované datové sady.

-- Trained model on version 15 of Delta table
CREATE TABLE delta.`/model/dataset` CLONE entire_dataset VERSION AS OF 15

Krátkodobé experimenty v produkční tabulce

Chcete-li otestovat pracovní postup v produkční tabulce bez poškození tabulky, můžete snadno vytvořit poškozený klon. To vám umožní spouštět libovolné pracovní postupy v klonované tabulce, která obsahuje všechna produkční data, ale nemá vliv na žádné provozní ú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;

Sdílení údajů

Jiné obchodní jednotky v jedné organizaci můžou chtít přistupovat ke stejným datům, ale nemusí vyžadovat nejnovější aktualizace. Místo přímého poskytnutí přístupu ke zdrojové tabulce můžete pro různé obchodní jednotky použít klony s různými oprávněními. Výkon klonu může být větší než v jednoduchém zobrazení.

-- Perform deep clone
CREATE OR REPLACE TABLE shared_table CLONE my_prod_table;

-- Grant other users access to the shared table
GRANT SELECT ON shared_table TO `<user-name>@<user-domain>.com`;

Přepsání vlastností tabulky

Přepsání vlastností tabulky jsou zvláště užitečná pro:

  • Přidávání poznámek k tabulkám s informacemi o vlastníkovi nebo uživateli při sdílení dat s různými obchodními jednotkami.

  • Archivace rozdílových tabulek a časová cesta je povinná. Dobu uchování protokolu můžete zadat nezávisle pro archivní tabulku. Například:

    SQL
    CREATE OR REPLACE archive.my_table CLONE prod.my_table
    LOCATION 'xx://archive/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('xx://archive/my_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("xx://archive/my_table", isShallow = false, replace = true, properties = tblProps)