Bagikan melalui


Pelebaran Tipe

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, , intlong, , decimal,double
short int,long,decimal,double
int long, , decimaldouble
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, intatau 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, atau long ke decimal atau double. 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 allowSourceColumnTypeChangepembaca 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 ke decimal atau double
  • peningkatan skala desimal
  • date ke timestampNTZ

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.