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 şeklindedirTIMESTAMP
. -
YEAR(col)
ve türücol
ise şeklindedirTIMESTAMP
. - tarafından
YEAR(col), MONTH(col)
tanımlanan ve türücol
olan iki bölüm sütunudurTIMESTAMP
. - tarafından
YEAR(col), MONTH(col), DAY(col)
tanımlanan üç bölüm sütunu ve türücol
şeklindedirTIMESTAMP
. - tarafından
YEAR(col), MONTH(col), DAY(col), HOUR(col)
tanımlanan dört bölüm sütunu ve türücol
şeklindedirTIMESTAMP
. -
SUBSTRING(col, pos, len)
ve türücol
:STRING
-
DATE_FORMAT(col, format)
ve türücol
ise şeklindedirTIMESTAMP
.- Tarih biçimlerini yalnızca şu desenlerle kullanabilirsiniz:
yyyy-MM
veyyyy-MM-dd-HH
. - Databricks Runtime 10.4 LTS ve üzerinde aşağıdaki deseni de kullanabilirsiniz:
yyyy-MM-dd
.
- Tarih biçimlerini yalnızca şu desenlerle kullanabilirsiniz:
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 1
ayarlanır. adım boyutunu 0
belirtemezsiniz.
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 2
ile tüm değerler pozitif çift sayılardır, ancak bazı çift sayılar atlanabilir.
yan tümcesini GENERATED BY DEFAULT AS IDENTITY
kullanı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 BIGINT
desteklenen 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:
- Kimlik sütunu tanımı ve diğer tablo özellikleri dahil olmak üzere doğru şemaya sahip bir tablo oluşturun.
- 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 TABLE
ADD
kimlik sütununuREPLACE
kullanamazsı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.