Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Important
Fitur ini ada di Pratinjau Umum.
Kolom yang dihasilkan Delta Lake secara otomatis menghitung dan menyimpan nilai dari ekspresi yang ditentukan pengguna di atas kolom lain dalam tabel. Saat Anda menulis ke tabel tanpa menyediakan nilai untuk kolom yang dihasilkan, Delta Lake menghitungnya secara otomatis. Jika Anda memberikan nilai, nilai tersebut harus dipenuhi (<value> <=> <generation expression>) IS TRUE atau penulisan gagal. Lihat Batasan di Azure Databricks.
Misalnya, Anda dapat menghitung price_with_tax kolom dari base_price * 1.1 tanpa memerlukan penulisan untuk menentukan data untuk price_with_tax.
Seperti kolom reguler, kolom yang dihasilkan disimpan secara fisik dalam file data yang mendasar tabel.
Note
Mengaktifkan kolom yang dihasilkan meningkatkan protokol penulis tabel. Ini dapat memengaruhi kompatibilitas dengan klien Delta Lake eksternal. Lihat Kompatibilitas dan protokol fitur Delta Lake.
Membuat tabel dengan kolom yang dihasilkan
Contoh berikut menunjukkan cara membuat tabel dengan kolom yang dihasilkan:
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()
Ekspresi yang didukung
Ekspresi pembuatan dapat menggunakan fungsi SQL deterministik apa pun yang selalu mengembalikan hasil yang sama untuk input yang sama. Contohnya:
- Aritmatika:
base_price * 1.1 - Fungsi string:
CONCAT(first_name, ' ', last_name),SUBSTRING(col, 1, 3) - Fungsi tanggal:
CAST(birthDate AS DATE),YEAR(eventTime)
Jenis fungsi berikut tidak didukung:
- Fungsi yang ditentukan pengguna
- Fungsi agregat
- Fungsi jendela
- Fungsi yang mengembalikan beberapa baris
Pembuatan Filter Partisi
Note
Databricks merekomendasikan pengklusteran cairan untuk semua tabel Delta Lake baru. Lihat Menggunakan pengklusteran cair untuk tabel.
Saat Anda mempartisi tabel menggunakan kolom yang dihasilkan dan kueri pada kolom dasar, Delta Lake secara otomatis mendapatkan filter partisi jika memungkinkan. Anda tidak diharuskan memfilter kolom partisi yang dihasilkan secara eksplisit. Delta Lake menyimpulkan rentang partisi dari nilai kolom dasar.
Photon dibutuhkan dalam Databricks Runtime 10.4 LTS dan versi sebelumnya. Photon tidak diperlukan dalam Databricks Runtime 11.3 LTS ke atas.
Pembuatan filter partisi didukung untuk ekspresi berikut:
-
CAST(col AS DATE)dan jenisnyacoladalahTIMESTAMP. -
YEAR(col)dan jenisnyacoladalahTIMESTAMP. - Dua kolom partisi yang ditentukan oleh
YEAR(col), MONTH(col)dan jeniscoladalahTIMESTAMP. - Tiga kolom partisi yang ditentukan oleh
YEAR(col), MONTH(col), DAY(col)dan jenis daricoladalahTIMESTAMP. - Empat kolom partisi yang ditentukan oleh
YEAR(col), MONTH(col), DAY(col), HOUR(col)dan jeniscoladalahTIMESTAMP. -
SUBSTRING(col, pos, len)dan jenisnyacoladalahSTRING -
DATE_FORMAT(col, format)dan jenisnyacoladalahTIMESTAMP.- Anda hanya dapat menggunakan format tanggal dengan pola berikut:
yyyy-MMdanyyyy-MM-dd-HH. - Di Databricks Runtime 10.4 LTS ke atas, Anda juga dapat menggunakan pola berikut:
yyyy-MM-dd.
- Anda hanya dapat menggunakan format tanggal dengan pola berikut:
Contoh: partisi tunggal
Misalnya, dengan tabel berikut:
CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)
Jika Anda kemudian menjalankan kueri berikut:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" AND eventTime <= "2020-10-01 12:00:00"
Delta Lake secara otomatis menghasilkan filter partisi sehingga kueri sebelumnya hanya membaca data dalam partisi date=2020-10-01 meskipun filter partisi tidak ditentukan.
Gunakan klausa EXPLAIN dan periksa rencana yang disediakan untuk melihat apakah Delta Lake secara otomatis menghasilkan filter partisi.
Contoh: beberapa partisi
Misalnya, dengan tabel berikut:
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)
Jika Anda kemudian menjalankan kueri berikut:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" AND eventTime <= "2020-10-01 12:00:00"
Delta Lake secara otomatis menghasilkan filter partisi sehingga kueri sebelumnya hanya membaca data dalam partisi year=2020/month=10/day=01 meskipun filter partisi tidak ditentukan.
Gunakan klausa EXPLAIN dan periksa rencana yang disediakan untuk melihat apakah Delta Lake secara otomatis menghasilkan filter partisi.
Kolom identitas
Important
Mendeklarasikan kolom identitas pada tabel Delta Lake menonaktifkan transaksi bersamaan. Hanya gunakan kolom identitas dalam kasus penggunaan di mana penulisan bersamaan ke tabel target tidak diperlukan. Lihat Batasan kolom identitas.
Kolom identitas Delta Lake adalah jenis kolom yang dihasilkan yang menetapkan nilai unik untuk setiap rekaman yang disisipkan ke dalam tabel. Contoh berikut menunjukkan sintaks dasar untuk mendeklarasikan kolom identitas selama pernyataan buat tabel:
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
API Scala dan Python untuk kolom identitas tersedia di Databricks Runtime 16.0 ke atas.
Untuk melihat semua opsi sintaks SQL untuk membuat tabel dengan kolom identitas, lihat CREATE TABLE [USING].
Anda dapat secara opsional menentukan hal berikut:
- Nilai awal.
- Ukuran langkah, yang bisa positif atau negatif.
Baik nilai awal maupun ukuran langkah diatur ke pengaturan awal 1. Anda tidak dapat menentukan ukuran langkah 0.
Nilai yang ditetapkan oleh kolom identitas bersifat unik dan bertambah ke arah langkah yang ditentukan, dan dalam kelipatan ukuran langkah yang ditentukan, tetapi tidak dijamin berdampingan. Misalnya, dengan nilai awal 0 dan ukuran langkah 2, semua nilai adalah angka genap positif, meskipun beberapa angka genap mungkin dilewati.
Saat menggunakan klausa GENERATED BY DEFAULT AS IDENTITY, operasi sisipkan dapat menentukan nilai untuk kolom identitas. Ubah klausul menjadi GENERATED ALWAYS AS IDENTITY untuk mengambil alih kemampuan untuk mengatur nilai secara manual.
Kolom identitas hanya mendukung jenis BIGINT, dan operasi gagal jika nilai yang ditetapkan melebihi rentang yang didukung oleh BIGINT.
Untuk mempelajari tentang menyinkronkan nilai kolom identitas dengan data, lihat ALTER TABLE klausa ... COLUMN.
Kolom CTAS dan kolom identitas
Anda tidak dapat menentukan skema, batasan kolom identitas, atau spesifikasi tabel lainnya saat menggunakan pernyataan CREATE TABLE table_name AS SELECT (CTAS).
Untuk membuat tabel baru dengan kolom identitas dan mengisinya dengan data yang sudah ada, lakukan hal berikut:
- Buat tabel dengan skema yang benar, termasuk definisi kolom identitas dan properti tabel lainnya.
- Jalankan operasi
INSERT.
Contoh berikut menggunakan kata kunci DEFAULT untuk menentukan kolom identitas. Jika data yang disisipkan ke dalam tabel menyertakan nilai yang valid untuk kolom identitas, nilai-nilai ini digunakan.
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;
Batasan kolom identitas
Batasan berikut ada saat bekerja dengan kolom identitas:
- Transaksi bersamaan tidak didukung pada tabel dengan kolom identitas diaktifkan.
- Anda tidak dapat mempartisi tabel menurut kolom identitas.
- Anda tidak dapat menggunakan
ALTER TABLEuntukADD,REPLACE, atauCHANGEkolom identitas. - Anda tidak dapat memperbarui nilai kolom identitas untuk rekaman yang sudah ada.
Note
Untuk mengubah IDENTITY nilai untuk rekaman yang sudah ada, Anda harus menghapus rekaman dan INSERT sebagai rekaman baru.
Kolom dan masker kolom yang dihasilkan
Kolom yang dihasilkan tidak dapat mengacu pada kolom yang memiliki masker kolom karena nilai yang dihasilkan akan mengungkapkan data yang dilindungi oleh masker tersebut. Ini menimbulkan kesalahan dan kueri gagal. Lihat Filter baris dan masker kolom.
Berikut adalah contoh kesalahannya:
Anda tidak dapat membuat kolom yang dihasilkan yang ekspresinya merujuk pada kolom bertopeng. COLUMN_MASKSMeningkatkan _GENERATED_COLUMN_UNSUPPORTED.
CREATE TABLE tbl ( a INT MASK masking_function, generated_col INT GENERATED ALWAYS AS (a + 1) ) USING DELTA;Anda tidak dapat menerapkan masker kolom ke kolom yang sudah dirujuk oleh kolom yang dihasilkan. COLUMN_MASKSMeningkatkan _REFERENCED_BY_GENERATED_COLUMN. ADD_MASK.
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;Pembacaan dari tabel di mana kolom yang dihasilkan sudah merujuk ke kolom yang dibatasi aksesnya juga diblokir. COLUMN_MASKSMeningkatkan _REFERENCED_BY_GENERATED_COLUMN. READ_BLOCKED.
Untuk mengatasi semua kesalahan ini, Anda harus mendesain ulang tabel sehingga kolom yang dihasilkan dan kolom bertopeng tidak tumpang tindih.