Aracılığıyla paylaş


Delta Lake tarafından oluşturulan sütunlar

Önemli

Bu özellik Genel Önizlemededir.

Delta Lake, delta tablosundaki diğer sütunlar üzerinde kullanıcı tarafından belirtilen bir işleve göre değerleri otomatik olarak oluşturulan özel bir sütun türü olan oluşturulan sütunları destekler. Oluşturulan sütunlar içeren bir tabloya yazdığınızda ve bunlar için açıkça değer sağlamadığınızda, Delta Lake değerleri otomatik olarak hesaplar. Örneğin, zaman damgası sütunundan otomatik olarak bir tarih sütunu (tabloyu tarihe göre bölümleme için) oluşturabilirsiniz; tabloya yapılan tüm yazma işlemleri için yalnızca zaman damgası sütununa ait veriler belirtilmesi gerekir. Ancak, bunlar için açıkça değerler sağlarsanız, değerlerin kısıtlamayı (<value> <=> <generation expression>) IS TRUE karşılaması gerekir, aksi takdirde yazma işlemi bir hatayla başarısız olur.

Önemli

Oluşturulan sütunlarla oluşturulan tablolar, varsayılandan daha yüksek bir tablo yazıcı protokolü sürümüne sahiptir. Bkz . Azure Databricks Delta Lake özellik uyumluluğunu nasıl yönetir? Tablo protokolü sürümünün nasıl yönetileceğini ve tablo protokolü sürümünün daha yüksek bir sürümünün ne anlama geldiğini anlamak için.

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

Oluşturulan sütunlar normal sütunlarmış gibi depolanır. Yani, depolamayı kaplarlar.

Oluşturulan sütunlar için aşağıdaki kısıtlamalar geçerlidir:

  • Oluşturma ifadesi, Spark'ta aşağıdaki işlev türleri dışında aynı bağımsız değişken değerleri verildiğinde her zaman aynı sonucu döndüren tüm SQL işlevlerini kullanabilir:
    • Kullanıcı tanımlı işlevler.
    • Toplama işlevleri.
    • Pencere işlevleri.
    • Birden çok satır döndüren işlevler.

Delta Lake, bir bölüm sütunu aşağıdaki ifadelerden biri tarafından tanımlandığında sorgu için bölüm filtreleri oluşturabilir:

Not

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

  • CAST(col AS DATE) ve türü col ise şeklindedir TIMESTAMP.
  • YEAR(col) ve türü col ise şeklindedir TIMESTAMP.
  • tarafından YEAR(col), MONTH(col) tanımlanan ve türü col olan iki bölüm sütunudur TIMESTAMP.
  • tarafından YEAR(col), MONTH(col), DAY(col) tanımlanan üç bölüm sütunu ve türü col şeklindedir TIMESTAMP.
  • tarafından YEAR(col), MONTH(col), DAY(col), HOUR(col) tanımlanan dört bölüm sütunu ve türü col şeklindedir TIMESTAMP.
  • SUBSTRING(col, pos, len) ve türü col : STRING
  • DATE_FORMAT(col, format) ve türü col ise şeklindedir TIMESTAMP.
    • 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.

Bölüm sütunu önceki ifadelerden biri tarafından tanımlanırsa ve sorgu, bir oluşturma ifadesinin temel temel sütununu kullanarak verileri filtrelerse, Delta Lake temel sütun ile oluşturulan sütun arasındaki ilişkiye bakar ve mümkünse oluşturulan bölüm sütununa göre bölüm filtrelerini doldurur. Ö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" <= "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.

Başka bir örnek olarak, 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" <= "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.

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

Delta Lake'te kimlik sütunlarını kullanma

Önemli

Delta 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.

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

Not

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ümcesini olacak GENERATED ALWAYS AS IDENTITY ş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şlem ç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
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;

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 bir kimlik sütunuyla bölümleyemezsiniz.
  • , veya ALTER TABLEADD kimlik sütununu REPLACEkullanamazsınızCHANGE.
  • Mevcut bir kayıt için kimlik sütununun değerini güncelleştiremezsiniz.

Not

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