Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ö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. Tablo protokolü sürüm oluşturmayı ve tablo protokolünün daha yüksek bir sürümüne sahip olmanın ne anlama geldiğini anlamak için Delta Lake özellik uyumluluğu ve protokolleri'ne bakın.
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
)
Piton
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 programlama dili
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, depolama alanını 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)vecoltürüTIMESTAMP'dir. -
YEAR(col)vecoltürüTIMESTAMP'dir. -
YEAR(col), MONTH(col)tarafından tanımlanan ve türücololan iki bölüm sütunuTIMESTAMP'dir. - Üç bölüm sütunu
YEAR(col), MONTH(col), DAY(col)tarafından tanımlanmıştır vecoltürüTIMESTAMP'dir. -
YEAR(col), MONTH(col), DAY(col), HOUR(col)tarafından tanımlanan dört bölüm sütunu vardır vecoltürüTIMESTAMP’dir. -
SUBSTRING(col, pos, len)vecoltürü deSTRING -
DATE_FORMAT(col, format)vecoltürüTIMESTAMP'dir.- Tarih biçimlerini yalnızca şu desenlerle kullanabilirsiniz:
yyyy-MMveyyyy-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)
)
Piton
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 programlama dili
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ü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:
- Kimlik sütunu tanımı ve diğer tablo özellikleri dahil olmak üzere doğru şemaya sahip bir tablo oluşturun.
- Bir
INSERTiş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 bir kimlik sütunuyla bölümleyemezsiniz.
-
ALTER TABLE,ADD,REPLACEveyaCHANGEiçin bir kimlik sütununu kullanamazsınız. - 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.