Delta Lake által létrehozott oszlopok
Fontos
Ez a funkció a nyilvános előzetes verzióban érhető el.
A Delta Lake támogatja a létrehozott oszlopokat, amelyek olyan speciális típusú oszlopok, amelyek értékei automatikusan létrejönnek egy felhasználó által megadott függvény alapján a Delta tábla más oszlopai felett. Amikor létrehozott oszlopokat tartalmazó táblába ír, és nem ad meg explicit módon értékeket, a Delta Lake automatikusan kiszámítja az értékeket. Létrehozhat például egy dátumoszlopot (a tábla dátum szerinti particionálásához) az időbélyeg oszlopból; a táblába történő írásoknak csak az időbélyeg oszlop adatait kell megadniuk. Ha azonban explicit módon ad meg értékeket, az értékeknek meg kell felelniük a kényszernek(<value> <=> <generation expression>) IS TRUE
, vagy az írás hiba miatt meghiúsul.
Fontos
A létrehozott oszlopokkal létrehozott táblák az alapértelmezettnél magasabb táblaíró protokollverzióval rendelkeznek. Az Azure Databricks hogyan kezeli a Delta Lake szolgáltatáskompatibilitását? című témakörben megismerheti a táblaprotokoll-verziószámozást, és azt, hogy mit jelent a táblaprotokoll-verzió magasabb szintű verziója.
Tábla létrehozása generált oszlopokkal
Az alábbi példa bemutatja, hogyan hozhat létre létrehozott oszlopokat tartalmazó táblát:
SQL
CREATE TABLE default.people10m (
id INT,
firstName STRING,
middleName STRING,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
dateOfBirth DATE GENERATED ALWAYS AS (CAST(birthDate AS DATE)),
ssn STRING,
salary INT
)
Python
DeltaTable.create(spark) \
.tableName("default.people10m") \
.addColumn("id", "INT") \
.addColumn("firstName", "STRING") \
.addColumn("middleName", "STRING") \
.addColumn("lastName", "STRING", comment = "surname") \
.addColumn("gender", "STRING") \
.addColumn("birthDate", "TIMESTAMP") \
.addColumn("dateOfBirth", DateType(), generatedAlwaysAs="CAST(birthDate AS DATE)") \
.addColumn("ssn", "STRING") \
.addColumn("salary", "INT") \
.execute()
Scala
DeltaTable.create(spark)
.tableName("default.people10m")
.addColumn("id", "INT")
.addColumn("firstName", "STRING")
.addColumn("middleName", "STRING")
.addColumn(
DeltaTable.columnBuilder("lastName")
.dataType("STRING")
.comment("surname")
.build())
.addColumn("lastName", "STRING", comment = "surname")
.addColumn("gender", "STRING")
.addColumn("birthDate", "TIMESTAMP")
.addColumn(
DeltaTable.columnBuilder("dateOfBirth")
.dataType(DateType)
.generatedAlwaysAs("CAST(dateOfBirth AS DATE)")
.build())
.addColumn("ssn", "STRING")
.addColumn("salary", "INT")
.execute()
A létrehozott oszlopok úgy vannak tárolva, mintha normál oszlopok lennének. Vagyis tárolót foglalnak el.
A létrehozott oszlopokra a következő korlátozások vonatkoznak:
- A generációs kifejezések bármilyen SQL-függvényt használhatnak a Sparkban, amely ugyanazt az eredményt adja vissza ugyanazon argumentumértékek megadásakor, kivéve a következő függvénytípusokat:
- Felhasználó által definiált függvények.
- Összesítő függvények.
- Ablakfüggvények.
- Több sort visszaadó függvények.
A Delta Lake akkor tud partíciószűrőket létrehozni egy lekérdezéshez, ha egy partícióoszlopot az alábbi kifejezések valamelyike határoz meg:
Feljegyzés
A Databricks Runtime 10.4 LTS-ben és az alábbi verziókban foton szükséges. A Databricks Runtime 11.3 LTS-ben és újabb verziókban nem szükséges foton.
CAST(col AS DATE)
és a típuscol
azTIMESTAMP
.YEAR(col)
és a típuscol
azTIMESTAMP
.- Két partícióoszlop van definiálva
YEAR(col), MONTH(col)
, és a típus azcol
TIMESTAMP
. - Három partícióoszlop van definiálva
YEAR(col), MONTH(col), DAY(col)
, és a típus azcol
TIMESTAMP
. - Négy partícióoszlop, amelyeket
YEAR(col), MONTH(col), DAY(col), HOUR(col)
a rendszer definiál, és a típusukcol
.TIMESTAMP
SUBSTRING(col, pos, len)
és a típus a következőcol
:STRING
DATE_FORMAT(col, format)
és a típuscol
azTIMESTAMP
.- Dátumformátumokat csak a következő mintákkal használhat:
yyyy-MM
ésyyyy-MM-dd-HH
. - A Databricks Runtime 10.4 LTS és újabb verziókban a következő mintát is használhatja:
yyyy-MM-dd
.
- Dátumformátumokat csak a következő mintákkal használhat:
Ha egy partícióoszlopot az előző kifejezések egyike határoz meg, és egy lekérdezés egy generációs kifejezés alapjául szolgáló alaposzlop használatával szűri az adatokat, a Delta Lake megvizsgálja az alaposzlop és a létrehozott oszlop közötti kapcsolatot, és lehetőség szerint feltölti a partíciószűrőket a létrehozott partícióoszlop alapján. Például a következő táblázat alapján:
CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)
Ha ezután a következő lekérdezést futtatja:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"
A Delta Lake automatikusan létrehoz egy partíciószűrőt, így az előző lekérdezés csak akkor olvassa be az adatokat a partíción date=2020-10-01
, ha nincs megadva partíciószűrő.
Egy másik példaként az alábbi táblázatot tekintve:
CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
year INT GENERATED ALWAYS AS (YEAR(eventTime)),
month INT GENERATED ALWAYS AS (MONTH(eventTime)),
day INT GENERATED ALWAYS AS (DAY(eventTime))
)
PARTITIONED BY (eventType, year, month, day)
Ha ezután a következő lekérdezést futtatja:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"
A Delta Lake automatikusan létrehoz egy partíciószűrőt, így az előző lekérdezés csak akkor olvassa be az adatokat a partíción year=2020/month=10/day=01
, ha nincs megadva partíciószűrő.
A EXPLAIN záradék használatával ellenőrizheti a megadott tervet, hogy a Delta Lake automatikusan létrehoz-e partíciószűrőket.
Identitásoszlopok használata a Delta Lake-ben
Fontos
Ha egy identitásoszlopot deklarál egy Delta-táblában, azzal letiltja az egyidejű tranzakciókat. Csak olyan esetekben használjon identitásoszlopokat, amikor nincs szükség egyidejű írásra a céltáblába.
A Delta Lake-identitásoszlopok olyan generált oszloptípusok, amelyek egyedi értékeket rendelnek a táblába beszúrt rekordokhoz. Az alábbi példa egy identitásoszlop deklarálásának alapszintaxisát mutatja be egy tábla-létrehozási utasítás során:
CREATE TABLE table_name (
identity_col BIGINT GENERATED BY DEFAULT AS IDENTITY,
other_column ...)
Az identitásoszlopokkal rendelkező táblák létrehozásának összes szintaxisbeállítását lásd: CREATE TABLE [USING].
Opcionálisan megadhatja a következőket:
- Kezdőérték.
- Egy lépésméret, amely lehet pozitív vagy negatív.
Az identitásoszlopok által hozzárendelt értékek egyediek, és a megadott lépés irányában és a megadott lépésméret többszörösében növeksenek, de nem garantált, hogy egybefüggőek. Például egy kezdőértékkel 0
és egy lépésmérettel 2
az összes érték pozitív páros szám, de egyes páros számok kihagyhatók.
A záradék GENERATED BY DEFAULT AS IDENTITY
használatakor a beszúrási műveletek megadhatják az identitásoszlop értékeit. Módosítsa úgy a záradékot, hogy GENERATED ALWAYS AS IDENTITY
felülbírálja az értékek manuális beállításának képességét.
Az identitásoszlopok csak a típust BIGINT
támogatják, és a műveletek meghiúsulnak, ha a hozzárendelt érték meghaladja a támogatott tartományt BIGINT
.
Az identitásoszlop értékeinek adatokkal való szinkronizálásáról az ALTER TABLE című témakörben olvashat.
Identitásoszlop korlátozásai
Az identitásoszlopok használatakor a következő korlátozások vonatkoznak:
- Az egyidejű tranzakciók nem támogatottak az identitásoszlopokat engedélyező táblákban.
- A táblák nem particionálhatók identitásoszlopok szerint.
- Nem használhatja
ALTER TABLE
aADD
,REPLACE
vagyCHANGE
identitásoszlopot. - Meglévő rekord identitásoszlopának értéke nem frissíthető.
Feljegyzés
Egy meglévő rekord értékének IDENTITY
módosításához törölnie kell a rekordot és INSERT
azt új rekordként.