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 eldobjaFileNotFoundException
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 parancsotvacuum
. - 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
vagyCTAS
. 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.
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, rendelkeznieMODIFY
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)