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.
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)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:
Ö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:
- 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 kimlik sütununa göre bölümleyemezsiniz.
- Bir kimlik sütununu
ALTER TABLEADD,REPLACEveyaCHANGEiç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:
Üretilmiş bir sütun, ifadesi maskelenmiş bir sütuna başvuruyorsa oluşturulamaz. Yükseltir COLUMN_MASKS_GENERATED_COLUMN_UNSUPPORTED.
CREATE TABLE tbl ( a INT MASK masking_function, generated_col INT GENERATED ALWAYS AS (a + 1) ) USING DELTA;Oluşturulan bir sütunun zaten başvurduğu bir sütuna sütun maskesi uygulayamazsınız. COLUMN_MASKS_REFERENCED_BY_GENERATED_COLUMN.ADD_MASK yükseltir.
CREATE TABLE tbl ( a INT, generated_col INT GENERATED ALWAYS AS (a + 1) ) USING DELTA; ALTER TABLE tbl ALTER COLUMN a SET MASK masking_function;Önceden oluşturulmuş bir sütunun zaten maskelenmiş bir sütuna başvurduğu bir tablodan yapılan okumalar da engellenir. _REFERENCED_BY_GENERATED_COLUMN.READ_BLOCKED yükseltirCOLUMN_MASKS.
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.