Udostępnij za pośrednictwem


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 typ col to TIMESTAMP.
  • YEAR(col) i typ col to TIMESTAMP.
  • Dwie kolumny partycji zdefiniowane przez YEAR(col), MONTH(col) element i typ col to TIMESTAMP.
  • Trzy kolumny partycji zdefiniowane przez YEAR(col), MONTH(col), DAY(col) element i typ col to TIMESTAMP.
  • Cztery kolumny partycji zdefiniowane przez YEAR(col), MONTH(col), DAY(col), HOUR(col) element i typ col to TIMESTAMP.
  • SUBSTRING(col, pos, len) a typ col to STRING
  • DATE_FORMAT(col, format) i typ col to TIMESTAMP.
    • Formaty dat można używać tylko z następującymi wzorcami: yyyy-MM i yyyy-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.

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 0kroku .

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 2kroku , 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 IDENTITYoperacje 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 BIGINTelement .

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:

  1. Utwórz tabelę z poprawnym schematem, w tym definicją kolumny tożsamości i innymi właściwościami tabeli.
  2. 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 do ADD, REPLACElub CHANGE 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.