Delta Lake-genererade kolumner

Viktigt!

Den här funktionen finns som allmänt tillgänglig förhandsversion.

Delta Lake stöder genererade kolumner som är en särskild typ av kolumn vars värden genereras automatiskt baserat på en användardefinerad funktion över andra kolumner i Delta-tabellen. När du skriver till en tabell med genererade kolumner och du inte uttryckligen anger värden för dem, beräknar Delta Lake automatiskt värdena. Du kan till exempel automatiskt generera en datumkolumn (för partitionering av tabellen efter datum) från tidsstämpelkolumnen. skrivningar till tabellen behöver bara ange data för tidsstämpelkolumnen. Men om du uttryckligen anger värden för dem måste värdena uppfylla villkoret(<value> <=> <generation expression>) IS TRUE, annars misslyckas skrivningen med ett fel.

Viktigt!

Tabeller som skapats med genererade kolumner har en högre protokollversion för tabellskrivare än standardversionen. Se Hur hanterar Azure Databricks Delta Lake-funktionskompatibilitet? för att förstå versionshantering av tabellprotokoll och vad det innebär att ha en högre version av en tabellprotokollversion.

Skapa en tabell med genererade kolumner

I följande exempel visas hur du skapar en tabell med genererade kolumner:

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()

Genererade kolumner lagras som om de vore normala kolumner. Det vill säger att de upptar lagring.

Följande begränsningar gäller för genererade kolumner:

  • Ett generationsuttryck kan använda alla SQL-funktioner i Spark som alltid returnerar samma resultat när samma argumentvärden anges, förutom följande typer av funktioner:
    • Användardefinierade funktioner.
    • Mängdfunktioner.
    • Fönsterfunktioner.
    • Funktioner som returnerar flera rader.

Delta Lake kan generera partitionsfilter för en fråga när en partitionskolumn definieras av något av följande uttryck:

Kommentar

Photon krävs i Databricks Runtime 10.4 LTS och nedan. Photon krävs inte i Databricks Runtime 11.3 LTS och senare.

  • CAST(col AS DATE) och typen av col är TIMESTAMP.
  • YEAR(col) och typen av col är TIMESTAMP.
  • Två partitionskolumner som definieras av YEAR(col), MONTH(col) och typen av col är TIMESTAMP.
  • Tre partitionskolumner som definieras av YEAR(col), MONTH(col), DAY(col) och typen av col är TIMESTAMP.
  • Fyra partitionskolumner som definieras av YEAR(col), MONTH(col), DAY(col), HOUR(col) och typen av col är TIMESTAMP.
  • SUBSTRING(col, pos, len) och typen av col är STRING
  • DATE_FORMAT(col, format) och typen av col är TIMESTAMP.
    • Du kan bara använda datumformat med följande mönster: yyyy-MM och yyyy-MM-dd-HH.
    • I Databricks Runtime 10.4 LTS och senare kan du också använda följande mönster: yyyy-MM-dd.

Om en partitionskolumn definieras av ett av föregående uttryck och en fråga filtrerar data med hjälp av den underliggande baskolumnen i ett generationsuttryck, tittar Delta Lake på relationen mellan baskolumnen och den genererade kolumnen och fyller partitionsfilter baserat på den genererade partitionskolumnen om möjligt. Till exempel med följande tabell:

CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)

Om du sedan kör följande fråga:

SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"

Delta Lake genererar automatiskt ett partitionsfilter så att föregående fråga endast läser data i partitionen date=2020-10-01 även om ett partitionsfilter inte har angetts.

Som ett annat exempel, med tanke på följande tabell:

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)

Om du sedan kör följande fråga:

SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"

Delta Lake genererar automatiskt ett partitionsfilter så att föregående fråga endast läser data i partitionen year=2020/month=10/day=01 även om ett partitionsfilter inte har angetts.

Du kan använda en EXPLAIN-sats och kontrollera den angivna planen för att se om Delta Lake automatiskt genererar några partitionsfilter.

Använda identitetskolumner i Delta Lake

Viktigt!

Om du deklarerar en identitetskolumn i en Delta-tabell inaktiveras samtidiga transaktioner. Använd endast identitetskolumner i användningsfall där samtidiga skrivningar till måltabellen inte krävs.

Delta Lake-identitetskolumner är en typ av genererad kolumn som tilldelar unika värden för varje post som infogas i en tabell. I följande exempel visas den grundläggande syntaxen för att deklarera en identitetskolumn under en create table-instruktion:

CREATE TABLE table_name (
  identity_col BIGINT GENERATED BY DEFAULT AS IDENTITY,
  other_column ...)

Om du vill se alla syntaxalternativ för att skapa tabeller med identitetskolumner läser du CREATE TABLE [USING].

Du kan också ange följande:

  • Ett startvärde.
  • En stegstorlek som kan vara positiv eller negativ.

Värden som tilldelas av identitetskolumner är unika och ökar i riktning mot det angivna steget och i multiplar av den angivna stegstorleken, men garanteras inte vara sammanhängande. Till exempel med ett startvärde och 0 en stegstorlek på 2är alla värden positiva jämna tal, men vissa jämna tal kan hoppas över.

När du använder -satsen GENERATED BY DEFAULT AS IDENTITYkan infogningsåtgärder ange värden för identitetskolumnen. Ändra satsen så att GENERATED ALWAYS AS IDENTITY den åsidosätter möjligheten att ange värden manuellt.

Identitetskolumner stöder BIGINT endast typen och åtgärder misslyckas om det tilldelade värdet överskrider det intervall som stöds av BIGINT.

Mer information om hur du synkroniserar kolumnvärden för identiteter med data finns i ALTER TABLE.

Begränsningar för identitetskolumner

Följande begränsningar finns när du arbetar med identitetskolumner:

  • Samtidiga transaktioner stöds inte i tabeller med identitetskolumner aktiverade.
  • Du kan inte partitionera en tabell efter en identitetskolumn.
  • Du kan inte använda ALTER TABLE till ADD, REPLACEeller CHANGE en identitetskolumn.
  • Du kan inte uppdatera värdet för en identitetskolumn för en befintlig post.

Kommentar

Om du vill ändra IDENTITY värdet för en befintlig post måste du ta bort posten och INSERT den som en ny post.