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.

Bir EXPLAIN yan tümcesi kullanabilir ve Delta Lake'in otomatik olarak bölüm filtreleri 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:

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

Kimlik sütunlarıyla tablo oluşturmaya yönelik tüm 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.

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.

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 REPLACECHANGE kimlik sütununu ADDkullanamazsınızALTER TABLE.
  • 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.