Kolumny wygenerowane przez usługę Delta Lake
Ważne
Ta funkcja jest dostępna w publicznej wersji zapoznawczej.
Usługa Delta Lake obsługuje wygenerowane kolumny, które są specjalnym typem kolumny, których wartości są generowane automatycznie na podstawie funkcji określonej przez użytkownika w innych kolumnach w tabeli delty. Gdy zapisujesz w tabeli z wygenerowanymi kolumnami i nie podajesz jawnie wartości, usługa Delta Lake automatycznie oblicza wartości. Na przykład możesz automatycznie wygenerować kolumnę daty (na potrzeby partycjonowania tabeli według daty) z kolumny znacznika czasu; wszystkie operacje zapisu w tabeli wymagają tylko określenia danych dla kolumny sygnatury czasowej. Jeśli jednak jawnie podasz wartości, wartości muszą spełniać ograniczenie (<value> <=> <generation expression>) IS TRUE
lub zapis zakończy się niepowodzeniem z powodu błędu.
Ważne
Tabele utworzone z wygenerowanymi kolumnami mają wyższą wersję protokołu modułu zapisywania tabel niż domyślna. Zobacz How does Azure Databricks manage Delta Lake feature compatibility? (Jak usługa Azure Databricks zarządza zgodnością funkcji usługi Delta Lake?), aby zrozumieć przechowywanie wersji protokołu table protocol i co to znaczy mieć wyższą wersję protokołu tabeli.
Tworzenie tabeli z wygenerowanymi kolumnami
W poniższym przykładzie pokazano, jak utworzyć tabelę z wygenerowanymi kolumnami:
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()
Wygenerowane kolumny są przechowywane tak, jakby były normalnymi kolumnami. Oznacza to, że zajmują magazyn.
Następujące ograniczenia dotyczą wygenerowanych kolumn:
- Wyrażenie generacji może używać dowolnych funkcji SQL na platformie Spark, które zawsze zwracają ten sam wynik, jeśli podano te same wartości argumentów, z wyjątkiem następujących typów funkcji:
- Funkcje zdefiniowane przez użytkownika.
- Agregujących.
- Funkcje okna.
- Funkcje zwracające wiele wierszy.
Usługa Delta Lake może generować filtry partycji dla zapytania za każdym razem, gdy kolumna partycji jest definiowana przez jedno z następujących wyrażeń:
Uwaga
Funkcja Photon jest wymagana w środowisku Databricks Runtime 10.4 LTS i poniżej. Funkcja Photon nie jest wymagana w środowisku Databricks Runtime 11.3 LTS i nowszym.
CAST(col AS DATE)
i typcol
toTIMESTAMP
.YEAR(col)
i typcol
toTIMESTAMP
.- Dwie kolumny partycji zdefiniowane przez
YEAR(col), MONTH(col)
element i typcol
toTIMESTAMP
. - Trzy kolumny partycji zdefiniowane przez
YEAR(col), MONTH(col), DAY(col)
element i typcol
toTIMESTAMP
. - Cztery kolumny partycji zdefiniowane przez
YEAR(col), MONTH(col), DAY(col), HOUR(col)
element i typcol
toTIMESTAMP
. SUBSTRING(col, pos, len)
a typcol
toSTRING
DATE_FORMAT(col, format)
i typcol
toTIMESTAMP
.- Formaty dat można używać tylko z następującymi wzorcami:
yyyy-MM
iyyyy-MM-dd-HH
. - W środowisku Databricks Runtime 10.4 LTS i nowszym można również użyć następującego wzorca:
yyyy-MM-dd
.
- Formaty dat można używać tylko z następującymi wzorcami:
Jeśli kolumna partycji jest zdefiniowana przez jedno z poprzednich wyrażeń, a zapytanie filtruje dane przy użyciu podstawowej kolumny wyrażenia generowania, usługa Delta Lake analizuje relację między kolumną podstawową a wygenerowaną kolumną i wypełnia filtry partycji na podstawie wygenerowanej kolumny partycji, jeśli to możliwe. Na przykład biorąc pod uwagę następującą tabelę:
CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)
Jeśli następnie uruchomisz następujące zapytanie:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"
Usługa Delta Lake automatycznie generuje filtr partycji, dzięki czemu poprzednie zapytanie odczytuje tylko dane w partycji date=2020-10-01
, nawet jeśli nie określono filtru partycji.
W innym przykładzie, biorąc pod uwagę następującą tabelę:
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)
Jeśli następnie uruchomisz następujące zapytanie:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"
Usługa Delta Lake automatycznie generuje filtr partycji, dzięki czemu poprzednie zapytanie odczytuje tylko dane w partycji year=2020/month=10/day=01
, nawet jeśli nie określono filtru partycji.
Możesz użyć klauzuli EXPLAIN i sprawdzić podany plan, aby sprawdzić, czy usługa Delta Lake automatycznie generuje filtry partycji.
Używanie kolumn tożsamości w usłudze Delta Lake
Ważne
Deklarowanie kolumny tożsamości w tabeli delty powoduje wyłączenie współbieżnych transakcji. Używaj kolumn tożsamości tylko w przypadkach użycia, w których współbieżne zapisy do tabeli docelowej nie są wymagane.
Kolumny tożsamości usługi Delta Lake to typ wygenerowanej kolumny, która przypisuje unikatowe wartości dla każdego rekordu wstawionego do tabeli. W poniższym przykładzie przedstawiono podstawową składnię deklarowania kolumny tożsamości podczas instrukcji create table:
SQL
CREATE TABLE table_name (
id_col1 BIGINT GENERATED ALWAYS AS IDENTITY,
id_col2 BIGINT GENERATED ALWAYS AS IDENTITY (START WITH -1 INCREMENT BY 1),
id_col3 BIGINT GENERATED BY DEFAULT AS IDENTITY,
id_col4 BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH -1 INCREMENT BY 1)
)
Python
from delta.tables import DeltaTable, IdentityGenerator
from pyspark.sql.types import LongType
DeltaTable.create()
.tableName("table_name")
.addColumn("id_col1", dataType=LongType(), generatedAlwaysAs=IdentityGenerator())
.addColumn("id_col2", dataType=LongType(), generatedAlwaysAs=IdentityGenerator(start=-1, step=1))
.addColumn("id_col3", dataType=LongType(), generatedByDefaultAs=IdentityGenerator())
.addColumn("id_col4", dataType=LongType(), generatedByDefaultAs=IdentityGenerator(start=-1, step=1))
.execute()
Scala
import io.delta.tables.DeltaTable
import org.apache.spark.sql.types.LongType
DeltaTable.create(spark)
.tableName("table_name")
.addColumn(
DeltaTable.columnBuilder(spark, "id_col1")
.dataType(LongType)
.generatedAlwaysAsIdentity().build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col2")
.dataType(LongType)
.generatedAlwaysAsIdentity(start = -1L, step = 1L).build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col3")
.dataType(LongType)
.generatedByDefaultAsIdentity().build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col4")
.dataType(LongType)
.generatedByDefaultAsIdentity(start = -1L, step = 1L).build())
.execute()
Uwaga
Interfejsy API języka Scala i Python dla kolumn tożsamości są dostępne w środowisku Databricks Runtime 16.0 lub nowszym.
Aby wyświetlić wszystkie opcje składni SQL do tworzenia tabel z kolumnami tożsamości, zobacz CREATE TABLE [USING].
Opcjonalnie możesz określić następujące elementy:
- Wartość początkowa.
- Rozmiar kroku, który może być dodatni lub ujemny.
Domyślna wartość początkowa i rozmiar kroku to 1
. Nie można określić rozmiaru 0
kroku .
Wartości przypisane przez kolumny tożsamości są unikatowe i zwiększane w kierunku określonego kroku, a w wielokrotnościach określonego rozmiaru kroku, ale nie mają gwarancji, że są ciągłe. Na przykład z wartością 0
początkową i rozmiarem 2
kroku , wszystkie wartości są dodatnie parzystymi liczbami, ale niektóre liczby parzysty mogą zostać pominięte.
W przypadku używania klauzuli GENERATED BY DEFAULT AS IDENTITY
operacje wstawiania mogą określać wartości dla kolumny tożsamości. Zmodyfikuj klauzulę , aby GENERATED ALWAYS AS IDENTITY
zastąpić możliwość ręcznego ustawiania wartości.
Kolumny tożsamości obsługują BIGINT
tylko typ, a operacje kończą się niepowodzeniem, jeśli przypisana wartość przekracza zakres obsługiwany przez BIGINT
element .
Aby dowiedzieć się więcej o synchronizowaniu wartości kolumn tożsamości z danymi, zobacz ALTER TABLE ... Klauzula COLUMN.
CTAS i kolumny tożsamości
Nie można zdefiniować ograniczeń schematu, kolumn tożsamości ani żadnych innych specyfikacji tabeli podczas korzystania z CREATE TABLE table_name AS SELECT
instrukcji (CTAS).
Aby utworzyć nową tabelę z kolumną tożsamości i wypełnić ją istniejącymi danymi, wykonaj następujące czynności:
- Utwórz tabelę z poprawnym schematem, w tym definicją kolumny tożsamości i innymi właściwościami tabeli.
- Uruchom operację
INSERT
.
W poniższym przykładzie użyto słowa kluczowego DEFAULT
do zdefiniowania kolumny tożsamości. Jeśli dane wstawione do tabeli zawierają prawidłowe wartości dla kolumny tożsamości, zostaną użyte te wartości.
CREATE OR REPLACE TABLE new_table (
id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 5),
event_date DATE,
some_value BIGINT
);
-- Inserts records including existing IDs
INSERT INTO new_table
SELECT id, event_date, some_value FROM old_table;
-- Insert records and generate new IDs
INSERT INTO new_table
SELECT event_date, some_value FROM new_records;
Ograniczenia kolumn tożsamości
Podczas pracy z kolumnami tożsamości istnieją następujące ograniczenia:
- Transakcje współbieżne nie są obsługiwane w tabelach z włączonymi kolumnami tożsamości.
- Nie można podzielić tabeli na partycje według kolumny tożsamości.
- Nie można użyć
ALTER TABLE
elementu doADD
,REPLACE
lubCHANGE
kolumny tożsamości. - Nie można zaktualizować wartości kolumny tożsamości dla istniejącego rekordu.
Uwaga
Aby zmienić IDENTITY
wartość istniejącego rekordu, należy usunąć rekord i INSERT
go jako nowy rekord.