Delta Lake tarafından oluşturulan sütunlar

Important

Bu özellik Genel Önizleme aşamasındadır.

Delta Lake tarafından oluşturulan sütunlar, kullanıcı tanımlı bir ifadedeki değerleri tablodaki diğer sütunlar üzerinde otomatik olarak hesaplar ve depolar. Oluşturulan sütunlar için değer sağlamadan bir tabloya yazdığınızda Delta Lake bunları otomatik olarak hesaplar. Değer sağlarsanız, bunların (<value> <=> <generation expression>) IS TRUE koşulunu sağlaması gerekir; aksi takdirde yazma işlemi başarısız olur. Bkz. Azure Databricks'te kısıtlamalar.

Örneğin, yazma işlemlerinin price_with_tax için veri belirtmesini gerektirmeden, base_price * 1.1 öğesinden bir price_with_tax sütunu hesaplayabilirsiniz.

Normal sütunlar gibi, oluşturulan sütunlar da tablonun temel veri dosyalarında fiziksel olarak depolanır.

Note

Oluşturulan sütunların etkinleştirilmesi, tablo yazıcı protokollerini yükseltiyor. Bu, dış Delta Lake istemcileriyle uyumluluğu etkileyebilir. Bkz . Delta Lake özellik uyumluluğu ve protokolleri.

Oluşturulan sütunlarla tablo oluşturma

Aşağıdaki örnekte, oluşturulan sütunlarla bir tablonun nasıl oluşturulacağı gösterilmektedir:

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

Desteklenen ifadeler

Bir oluşturma ifadesi, her zaman aynı girişler için aynı sonucu döndüren herhangi bir belirleyici SQL işlevini kullanabilir. Örneğin:

  • Aritmetik: base_price * 1.1
  • Dize işlevleri: CONCAT(first_name, ' ', last_name), SUBSTRING(col, 1, 3)
  • Tarih işlevleri: CAST(birthDate AS DATE), YEAR(eventTime)

Aşağıdaki işlev türleri desteklenmez:

  • Kullanıcı tanımlı işlevler
  • Toplama işlevleri
  • Pencere işlevleri
  • Birden çok satır döndüren işlevler

Bölüm filtresi oluşturma

Note

Databricks, tüm yeni Delta Lake tabloları için sıvı kümeleme önerir. Bkz Tablolar için sıvı kümeleme kullanma.

Temel sütunda oluşturulan bir sütun ve sorgu kullanarak bir tabloyu bölümlediğinizde, Delta Lake mümkünse bölüm filtrelerini otomatik olarak türetir. Oluşturulan bölüm sütununu açıkça filtrelemeniz gerekmez. Delta Lake, bölüm aralığını temel sütun değerinden çıkartır.

Databricks Runtime 10.4 LTS ve altında foton gereklidir. Databricks Runtime 11.3 LTS ve üzerinde foton gerekli değildir.

Bölüm filtresi oluşturma aşağıdaki ifadeler için desteklenir:

  • CAST(col AS DATE) ve col türü TIMESTAMP'dir.
  • YEAR(col) ve col türü TIMESTAMP'dir.
  • YEAR(col), MONTH(col) tarafından tanımlanan ve türü col olan iki bölüm sütunu TIMESTAMP'dir.
  • Üç bölüm sütunu YEAR(col), MONTH(col), DAY(col) tarafından tanımlanmıştır ve col türü TIMESTAMP'dir.
  • YEAR(col), MONTH(col), DAY(col), HOUR(col) tarafından tanımlanan dört bölüm sütunu vardır ve col türü TIMESTAMP’dir.
  • SUBSTRING(col, pos, len) ve col türü de STRING
  • DATE_FORMAT(col, format) ve col türü TIMESTAMP'dir.
    • Tarih biçimlerini yalnızca şu desenlerle kullanabilirsiniz: yyyy-MM ve yyyy-MM-dd-HH.
    • Databricks Runtime 10.4 LTS ve üzerinde aşağıdaki deseni de kullanabilirsiniz: yyyy-MM-dd.

Örnek: tek bölüm

Örneğin, aşağıdaki tablo göz önünde bulundurulduğunda:

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

Ardından aşağıdaki sorguyu çalıştırırsanız:

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

Delta Lake otomatik olarak bir bölüm filtresi oluşturur, böylece önceki sorgu bir bölüm filtresi belirtilmemiş olsa bile yalnızca bölümdeki date=2020-10-01 verileri okur.

Delta Lake'in otomatik olarak herhangi bir bölüm filtresi oluşturup oluşturmadığını görmek için bir EXPLAIN yan tümce kullanın ve sağlanan planı denetleyin.

Örnek: birden çok bölüm

Örneğin, aşağıdaki tablo göz önünde bulundurulduğunda:

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)

Ardından aşağıdaki sorguyu çalıştırırsanız:

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

Delta Lake otomatik olarak bir bölüm filtresi oluşturur, böylece önceki sorgu bir bölüm filtresi belirtilmemiş olsa bile yalnızca bölümdeki year=2020/month=10/day=01 verileri okur.

Delta Lake'in otomatik olarak herhangi bir bölüm filtresi oluşturup oluşturmadığını görmek için bir EXPLAIN yan tümce kullanın ve sağlanan planı denetleyin.

Kimlik sütunları

Important

Delta Lake tablosunda kimlik sütunu bildirilmesi eşzamanlı işlemleri devre dışı bırakır. Yalnızca hedef tabloya eşzamanlı yazmanın gerekli olmadığı kullanım durumlarında kimlik sütunlarını kullanın. Bkz. Kimlik sütunu sınırlamaları.

Delta Lake kimlik sütunları, bir tabloya eklenen her kayıt için benzersiz değerler atayan oluşturulan bir sütun türüdür. Aşağıdaki örnekte, create table deyimi sırasında kimlik sütununu bildirmeye yönelik temel söz dizimi gösterilmektedir:

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

Note

Kimlik sütunları için Scala ve Python API'leri Databricks Runtime 16.0 ve üzerinde kullanılabilir.

Kimlik sütunlarıyla tablo oluşturmaya yönelik tüm SQL söz dizimi seçeneklerini görmek için bkz. CREATE TABLE [USING].

İsteğe bağlı olarak aşağıdakileri belirtebilirsiniz:

  • Başlangıç değeri.
  • Pozitif veya negatif olabilecek bir adım boyutu.

Hem başlangıç değeri hem de adım boyutu varsayılan olarak olarak 1ayarlanır. adım boyutunu 0belirtemezsiniz.

Kimlik sütunları tarafından atanan değerler benzersizdir ve belirtilen adım yönünde ve belirtilen adım boyutunun katlarında artar, ancak bitişik olacağı garantilanmaz. Örneğin, başlangıç değeri 0 ve adım boyutu 2ile tüm değerler pozitif çift sayılardır, ancak bazı çift sayılar atlanabilir.

yan tümcesini GENERATED BY DEFAULT AS IDENTITYkullanırken, ekleme işlemleri kimlik sütunu için değerleri belirtebilir. Değerleri el ile ayarlama özelliğini geçersiz kılmak için yan tümceyi GENERATED ALWAYS AS IDENTITY olacak şekilde değiştirin.

Kimlik sütunları yalnızca türü destekler BIGINT ve atanan değer tarafından BIGINTdesteklenen aralığı aşarsa işlemler başarısız olur.

Kimlik sütunu değerlerini verilerle eşitleme hakkında bilgi edinmek için bkz ALTER TABLE . ... COLUMN yan tümcesi.

CTAS ve kimlik sütunları

(CTAS) deyimini kullanırken CREATE TABLE table_name AS SELECT şema, kimlik sütunu kısıtlamaları veya diğer tablo belirtimlerini tanımlayamazsınız.

Kimlik sütunuyla yeni bir tablo oluşturmak ve bunu mevcut verilerle doldurmak için aşağıdakileri yapın:

  1. Kimlik sütunu tanımı ve diğer tablo özellikleri dahil olmak üzere doğru şemaya sahip bir tablo oluşturun.
  2. Bir INSERT işlemi çalıştırın.

Aşağıdaki örnek, kimlik sütununu DEFAULT tanımlamak için anahtar sözcüğünü kullanır. Tabloya eklenen veriler kimlik sütunu için geçerli değerler içeriyorsa, bu değerler kullanılır.

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 (id, event_date, some_value)
SELECT id, event_date, some_value FROM old_table;

-- Insert records and generate new IDs
INSERT INTO new_table (event_date, some_value)
SELECT event_date, some_value FROM new_records;

Kimlik sütunu sınırlamaları

Kimlik sütunlarıyla çalışırken aşağıdaki sınırlamalar vardır:

  • Eş zamanlı işlemler, kimlik sütunlarının etkinleştirildiği tablolarda desteklenmez.
  • Bir tabloyu kimlik sütununa göre bölümleyemezsiniz.
  • Bir kimlik sütununu ALTER TABLEADD, REPLACE veya CHANGE için kullanamazsınız.
  • Mevcut bir kayıt için kimlik sütununun değerini güncelleştiremezsiniz.

Note

Var olan bir kaydın IDENTITY değerini değiştirmek için kaydı ve INSERT yeni kayıt olarak silmeniz gerekir.

Oluşturulan sütunlar ve sütun maskeleri

Oluşturulan değer maskenin koruduğu temel verileri ortaya çıkaracağından, oluşturulan sütun, sütun maskesi uygulanmış bir sütuna başvuramaz. Bu bir hata oluşturur ve sorgu başarısız olur. Bkz. Satır filtreleri ve sütun maskeleri.

Hata örnekleri aşağıda verilmiştir:

Bu hataların tümünü çözmek için, oluşturulan sütunların ve maskelenmiş sütunların çakışmaması için tabloyu yeniden tasarlamanız gerekir.