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.
Penting
Fitur ini ada di Pratinjau Umum di Databricks Runtime 15.4 LTS ke atas.
Tabel dengan pelesiran tipe diaktifkan memungkinkan Anda mengubah jenis data kolom ke jenis yang lebih luas tanpa menulis ulang file data yang mendasar. Anda dapat mengubah jenis kolom secara manual atau menggunakan evolusi skema untuk mengembangkan jenis kolom.
Penting
Pengembangan tipe tersedia di Databricks Runtime 15.4 LTS dan seterusnya. Tabel dengan perluasan tipe diaktifkan hanya dapat dibaca di Databricks Runtime 15.4 LTS atau yang lebih tinggi.
Pelebaran jenis memerlukan Delta Lake. Semua tabel terkelola Unity Catalog menggunakan Delta Lake secara default.
Perubahan jenis yang didukung
Anda dapat melebarkan jenis sesuai dengan aturan berikut:
Jenis sumber | Jenis yang lebih beragam didukung |
---|---|
byte |
short , , int long , , decimal ,double |
short |
int ,long ,decimal ,double |
int |
long , , decimal double |
long |
decimal |
float |
double |
decimal |
decimal dengan lebih presisi dan dalam skala yang lebih besar |
date |
timestampNTZ |
Untuk menghindari secara tidak sengaja mempromosikan nilai bilangan bulat ke desimal, Anda harus menerapkan perubahan jenis secara manual dari byte
, , short
, int
atau long
ke decimal
atau double
. Saat mengubah jenis bilangan bulat ke decimal
atau double
, jika proses hilir menulis nilai ini kembali ke kolom bilangan bulat, Spark akan memangkas bagian desimal dari nilai tersebut secara default.
Catatan
Saat mengubah jenis numerik apa pun menjadi decimal
, presisi total harus sama dengan atau lebih besar dari presisi awal. Jika Anda juga meningkatkan skala, presisi total harus meningkat dengan jumlah yang sesuai.
Target minimum untuk jenis byte
, short
, dan int
adalah decimal(10,0)
. Target minimum untuk long
adalah decimal(20,0)
.
Jika Anda ingin menambahkan dua tempat desimal ke bidang dengan decimal(10,1)
, target minimum adalah decimal(12,3)
.
Perubahan jenis didukung untuk kolom dan bidang tingkat atas yang ditumpuk di dalam struktur, peta, dan array.
Aktifkan perluasan tipe
Anda dapat mengaktifkan pelebaran tipe pada tabel yang ada dengan mengatur delta.enableTypeWidening
properti tabel ke true
:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')
Anda juga dapat mengaktifkan pelebaran tipe saat pembuatan tabel.
CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')
Penting
Saat Anda mengaktifkan pelebaran tipe, ini mengatur fitur tabel typeWidening
, yang meningkatkan protokol pembaca dan penulis. Anda harus menggunakan Databricks Runtime 15.4 atau lebih tinggi untuk berinteraksi dengan tabel yang memiliki perluasan jenis diaktifkan. Jika klien eksternal juga berinteraksi dengan tabel, verifikasi bahwa klien tersebut mendukung fitur tabel ini. Lihat Kompatibilitas dan protokol fitur Delta Lake.
Menerapkan perubahan jenis secara manual
ALTER COLUMN
Gunakan perintah untuk mengubah jenis secara manual:
ALTER TABLE <table_name> ALTER COLUMN <col_name> TYPE <new_type>
Operasi ini memperbarui skema tabel tanpa menulis ulang file data yang mendasar.
Melebarkan jenis dengan evolusi skema otomatis
Evolusi skema berfungsi dengan pelebaran jenis untuk memperbarui jenis data dalam tabel target agar sesuai dengan jenis data masuk.
Catatan
Tanpa pelebaran jenis diaktifkan, evolusi skema selalu mencoba menurunkan data untuk mencocokkan jenis kolom dalam tabel target. Jika Anda tidak ingin secara otomatis memperluas tipe data di tabel sasaran Anda, nonaktifkan memperluas tipe sebelum Anda menjalankan beban kerja dengan perubahan skema diaktifkan.
Untuk menggunakan evolusi skema untuk memperlebar jenis data kolom selama penyerapan, Anda harus memenuhi kondisi berikut:
- Perintah write berjalan dengan evolusi skema otomatis yang diaktifkan.
- Tabel target memiliki pelebaran tipe yang diaktifkan.
- Jenis kolom sumber lebih lebar dari jenis kolom target.
- Pelebaran tipe mendukung perubahan tipe.
- Perubahan jenis bukan salah satu dari
byte
,short
,int
, ataulong
kedecimal
ataudouble
. Perubahan jenis ini hanya dapat diterapkan secara manual menggunakan ALTER TABLE untuk menghindari promosi bilangan bulat yang tidak disengaja ke desimal.
Ketidakcocokan jenis yang tidak memenuhi semua kondisi ini akan mengikuti aturan penerapan skema yang berlaku. Lihat Penegakan skema.
Menonaktifkan fitur pelebaran tabel jenis
Anda dapat mencegah perluasan jenis yang tidak disengaja pada tabel yang telah diaktifkan dengan mengatur properti ke false
:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'false')
Pengaturan ini mencegah perubahan tipe di masa mendatang pada tabel, tetapi tidak menghapus fitur pelebaran tipe pada tabel atau mengembalikan tipe yang telah berubah.
Jika Anda perlu menghapus sepenuhnya fitur pelebaran tipe di tabel, Anda dapat menggunakan perintah DROP FEATURE
seperti yang ditunjukkan dalam contoh berikut:
ALTER TABLE <table-name> DROP FEATURE 'typeWidening' [TRUNCATE HISTORY]
Catatan
Tabel yang mengaktifkan pelebaran jenis menggunakan Databricks Runtime 15.4 LTS memerlukan penghapusan fitur typeWidening-preview
sebagai gantinya.
Saat menghapus pelebaran tipe, semua file data yang tidak sesuai dengan skema tabel saat ini ditulis ulang. Lihat Menghilangkan fitur tabel Delta Lake dan menurunkan protokol tabel.
Streaming dari tabel Delta
Catatan
Dukungan untuk Type Widening di Structured Streaming tersedia di Databricks Runtime 16.3 dan yang lebih baru.
Saat streaming dari tabel Delta, perubahan jenis diperlakukan sebagai perubahan skema non-aditif, mirip dengan mengganti nama atau menghilangkan kolom dengan Pemetaan Kolom.
Anda dapat menyediakan lokasi pelacakan skema untuk mengaktifkan streaming dari tabel Delta Lake dengan perubahan jenis yang diterapkan.
Setiap pembacaan streaming terhadap sumber data harus memiliki schemaTrackingLocation
yang ditentukan sendiri. Yang ditentukan schemaTrackingLocation
harus dimuat dalam direktori yang ditentukan untuk checkpointLocation
tabel target untuk penulisan streaming.
Catatan
Untuk beban kerja streaming yang menggabungkan data dari beberapa tabel Delta sumber, Anda harus menentukan direktori unik di checkpointLocation
untuk setiap tabel sumber.
Opsi schemaTrackingLocation
ini digunakan untuk menentukan jalur untuk pelacakan skema, seperti yang ditunjukkan dalam contoh kode berikut:
Phyton
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
Scala
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
Setelah menyediakan lokasi pelacakan skema, aliran akan mengembangkan skema yang dilacak setiap kali perubahan jenis terdeteksi lalu berhenti. Pada saat itu, Anda dapat mengambil tindakan yang diperlukan untuk menangani perubahan jenis, seperti mengaktifkan pelebaran jenis pada tabel bawah atau memperbarui kueri streaming.
Untuk melanjutkan pemrosesan, atur konfigurasi spark.databricks.delta.streaming.allowSourceColumnTypeChange
Spark atau opsi allowSourceColumnTypeChange
pembaca DataFrame :
Phyton
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
# alternatively to allow all future type changes for this stream:
# .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
Scala
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
// alternatively to allow all future type changes for this stream:
// .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
SQL
-- To unblock for this particular stream just for this series of schema change(s):
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange.ckpt_<checkpoint_id> = "<delta_source_table_version>"
-- To unblock for this particular stream:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "<delta_source_table_version>"
-- To unblock for all streams:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "always"
titik pemeriksaan ID <checkpoint_id>
dan versi tabel sumber Delta Lake <delta_source_table_version>
ditampilkan dalam pesan kesalahan ketika aliran berhenti.
Berbagi Delta
Catatan
Dukungan untuk Pelebaran Tipe pada Delta Sharing tersedia di Databricks Runtime 16.1 ke atas.
Berbagi tabel Delta Lake dengan pelebaran tipe yang diaktifkan didukung dalam Berbagi Delta dari Databricks ke Databricks. Penyedia dan penerima harus berada di Databricks Runtime 16.1 atau lebih tinggi.
Untuk membaca Umpan Data Perubahan dari tabel Delta Lake dengan pelebaran tipe diaktifkan menggunakan Delta Sharing, Anda harus menetapkan format tanggapan ke delta
.
spark.read
.format("deltaSharing")
.option("responseFormat", "delta")
.option("readChangeFeed", "true")
.option("startingVersion", "<start version>")
.option("endingVersion", "<end version>")
.load("<table>")
Mengubah umpan data pada perubahan tipe tidak didukung. Anda harus membagi operasi menjadi dua pembacaan terpisah, satu berakhir pada versi tabel yang mengandung perubahan tipe, dan yang lain dimulai pada versi yang mengandung perubahan tipe.
Keterbatasan
Kompatibilitas Apache Iceberg
Apache Iceberg tidak mendukung semua perubahan tipe yang dicakup oleh pelebaran tipe, lihat Iceberg Schema Evolution. Secara khusus, Azure Databricks tidak mendukung perubahan jenis berikut:
-
byte
,short
,int
,long
kedecimal
ataudouble
- peningkatan skala desimal
-
date
ketimestampNTZ
Saat kompatibilitas UniForm dengan Iceberg diaktifkan pada tabel Delta Lake, menerapkan salah satu perubahan jenis ini menghasilkan kesalahan.
Jika Anda menerapkan salah satu perubahan jenis yang tidak didukung ini ke tabel Delta Lake, mengaktifkan Uniform dengan kompatibilitas Iceberg pada tabel akan menghasilkan kesalahan. Untuk mengatasi kesalahan, Anda harus menghapus fitur perluasan tipe tabel.
Batasan Lainnya
- Menyediakan lokasi pelacakan skema menggunakan SQL saat streaming dari tabel Delta Lake dengan perubahan jenis tidak didukung.
- Berbagi tabel menggunakan Delta Sharing dengan pelebaran tipe yang diaktifkan untuk konsumen non-Databricks tidak didukung.