Tábla klónozása az Azure Databricksben

A parancs használatával létrehozhat egy meglévő Delta Lake-tábla másolatát az clone Azure Databricksben egy adott verzióban. A klónok lehetnek mélyek vagy sekélyek.

Az Azure Databricks a Parquet- és Iceberg-táblák klónozását is támogatja. Lásd: Parquet- és Iceberg-táblák növekményes klónozása a Delta Lake-be.

A klón unity katalógussal való használatáról további információt a Unity Catalog tábláinak Sekély klónja című témakörben talál.

Feljegyzés

A Databricks azt javasolja, hogy a Delta Sharing használatával csak olvasható hozzáférést biztosítson a különböző szervezetek tábláihoz. Lásd: Adatok és AI-eszközök biztonságos megosztása a Delta Sharing használatával.

Klónozási típusok

  • A mély klón egy klón, amely a forrástábla adatait a meglévő tábla metaadatain kívül a klónozási célba másolja. Emellett a stream metaadatai is klónozva vannak, így a Delta-táblába írt streamek leállíthatók egy forrástáblán, és folytathatók egy klón céltábláján, ahonnan abbahagyta.
  • A sekély klón olyan klón, amely nem másolja az adatfájlokat a klónozási célba. A tábla metaadatai megegyeznek a forrásadatokkal. Ezek a klónok olcsóbb létrehozni.

A klónozott metaadatok a következők: séma, particionálási információk, invariánsok, nullability. Csak a mély klónok esetében a stream és a COPY INTO metaadatok is klónozásra kerülnek. A nem klónozott metaadatok a tábla leírása és a felhasználó által definiált véglegesítési metaadatok.

Mik a Delta klónozási műveletek szemantikája?

Ha a Hive metaadattárában regisztrált Delta-táblával vagy nem táblaként regisztrált fájlok gyűjteményével dolgozik, a klónozás a következő szemantikával rendelkezik:

Fontos

A Databricks Runtime 13.3 LTS és újabb verziókban a Unity Catalog által felügyelt táblák támogatják a sekély klónokat. A Unity Catalog-táblák klón szemantikája jelentősen eltér a delta lake-i klón szemantikától más környezetekben. Lásd: Shallow clone for Unity Catalog tables.

  • A mély vagy a sekély klónok módosításai csak magukat a klónokat érintik, a forrástáblát nem.
  • A sekély klónok a forráskönyvtárban lévő adatfájlokra hivatkoznak. Ha a forrástáblán fut vacuum , az ügyfelek már nem tudják beolvasni a hivatkozott adatfájlokat, és a rendszer eldobja FileNotFoundException a fájlt. Ebben az esetben a klón futtatása a sekély klónra cserélve javítja ki a klónt. Ha ez gyakran előfordul, fontolja meg egy mély klón használatát, amely nem függ a forrástáblától.
  • A mély klónok nem függnek attól a forrástól, amelyből klónozzák őket, de költségesek létrehozni őket, mert egy mély klón az adatokat és a metaadatokat is átmásolja.
  • Ha olyan célhoz replace klónoz, amelynek már van táblája az útvonalon, deltanaplót hoz létre, ha az adott útvonalon nem létezik. A meglévő adatok törléséhez futtassa a parancsot vacuum.
  • Meglévő Delta-táblák esetében létrejön egy új véglegesítés, amely tartalmazza az új metaadatokat és a forrástáblából származó új adatokat. Ez az új véglegesítés növekményes, ami azt jelenti, hogy csak az utolsó klón óta történt új módosítások lesznek véglegesítve a táblában.
  • A táblák klónozása nem ugyanaz, mint Create Table As Select vagy CTAS. Egy klón az adatok mellett a forrástábla metaadatait is átmásolja. A klónozásnak egyszerűbb szintaxisa is van: nem kell particionálást, formázást, invariánsokat, nullképességet stb. megadnia, mivel ezek a forrástáblából származnak.
  • A klónozott táblák független előzményei vannak a forrástáblából. A klónozott táblák időutazási lekérdezései nem működnek ugyanazokkal a bemenetekkel, mint a forrástáblán.

Példa klónozási szintaxisra

Az alábbi példakódok a mély és sekély klónok létrehozásának szintaxisát mutatják be:

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 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, "/path/to/table")  # path-based tables, or
deltaTable = DeltaTable.forName(spark, "source_table")    # Hive metastore-based tables

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.forPath(spark, "/path/to/table")
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

A szintaxis részleteiért lásd: CREATE TABLE CLONE.

Metrikák klónozása

CLONE a művelet befejezése után a következő metrikákat egyetlen sorú DataFrame-adatkeretként jelenti:

  • source_table_size: A klónozott forrástábla mérete bájtban.
  • source_num_of_files: A forrástáblában lévő fájlok száma.
  • num_removed_files: Ha a tábla cseréje folyamatban van, a rendszer hány fájlt távolít el az aktuális táblából.
  • num_copied_files: A forrásból másolt fájlok száma (sekély klónok esetén 0).
  • removed_files_size: Az aktuális táblából eltávolított fájlok mérete bájtban.
  • copied_files_size: A táblázatba másolt fájlok mérete bájtban.

Példa klónozási metrikákra

Engedélyek

Az Azure Databricks táblahozzáférés-vezérléséhez és a felhőszolgáltatójához szükséges engedélyeket kell konfigurálnia.

Táblázat hozzáférés-vezérlése

A mély és a sekély klónokhoz a következő engedélyek szükségesek:

  • SELECT engedély a forrástáblában.
  • Ha új táblát hoz CLONE létre, engedélyezze azt az adatbázist, CREATE amelyben a táblát hozza létre.
  • Ha táblát szeretne CLONE cserélni, rendelkeznie MODIFY kell engedéllyel a táblán.

Felhőszolgáltatói engedélyek

Ha létrehozott egy mély klónt, a mély klónt olvasó összes felhasználónak olvasási hozzáféréssel kell rendelkeznie a klón könyvtárához. A klón módosításához a felhasználóknak írási hozzáféréssel kell rendelkezniük a klón könyvtárához.

Ha létrehozott egy sekély klónt, minden olyan felhasználónak, aki beolvassa a sekély klónt, engedéllyel kell olvasnia a fájlokat az eredeti táblában, mivel az adatfájlok a forrástáblában maradnak sekély klónokkal, valamint a klón könyvtárával. A klón módosításához a felhasználóknak írási hozzáférésre lesz szükségük a klón könyvtárához.

Klón használata adatarchiváláshoz

A mély klónozással megőrizheti egy tábla állapotát egy adott időpontban archiválási célokra. A mély klónok növekményes szinkronizálásával megőrizheti a vészhelyreállításhoz használt forrástáblák frissített állapotát.

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

Klón használata az ML-modell többszörözéséhez

Gépi tanulás közben érdemes lehet archiválni egy táblázat egy bizonyos verzióját, amelyre betanított egy ML-modellt. A jövőbeli modelleket ezzel az archivált adatkészlettel lehet tesztelni.

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

Klón használata rövid távú kísérletekhez éles táblán

Ha egy munkafolyamatot a tábla sérülése nélkül szeretne tesztelni egy éles táblán, egyszerűen létrehozhat egy sekély klónt. Ez lehetővé teszi tetszőleges munkafolyamatok futtatását a klónozott táblán, amely tartalmazza az összes éles adatot, de nem befolyásolja az éles számítási feladatokat.

-- 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;

Táblatulajdonságok felülbírálása klónozás használatával

Feljegyzés

A Databricks Runtime 7.5-ös vagy újabb verziója érhető el.

A táblatulajdonságok felülbírálása különösen hasznos a következő esetekben:

  • Táblák jegyzetelése tulajdonosi vagy felhasználói adatokkal, amikor adatokat oszt meg különböző üzleti egységekkel.
  • Delta-táblák és táblaelőzmények vagy időutazás archiválása szükséges. Az archív tábla adat- és naplómegőrzési időszakait egymástól függetlenül is megadhatja. Példa:

SQL

CREATE OR REPLACE TABLE archive.my_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
LOCATION 'xx://archive/my_table'

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)