Menggunakan pengklusteran cairan untuk tabel Delta
Pengklusteran cairan Delta Lake menggantikan pemartisian tabel dan ZORDER
untuk menyederhanakan keputusan tata letak data dan mengoptimalkan performa kueri. Pengklusteran cair memberikan fleksibilitas untuk menentukan ulang kunci pengklusteran tanpa menulis ulang data yang ada, memungkinkan tata letak data berkembang bersama kebutuhan analitik dari waktu ke waktu. Pengklusteran cairan berlaku untuk Tabel Streaming dan Tampilan Materialisasi.
Penting
Databricks merekomendasikan penggunaan Databricks Runtime 15.2 ke atas untuk semua tabel dengan pengklusteran cairan diaktifkan. Dukungan pratinjau publik dengan batasan tersedia di Databricks Runtime 13.3 LTS ke atas.
Catatan
Tabel dengan pengelompokan dinamis yang diaktifkan mendukung konkurensi baris di Databricks Runtime versi LTS 13.3 ke atas. Konkurensi tingkat baris umumnya tersedia di Databricks Runtime 14.2 ke atas untuk semua tabel dengan vektor penghapusan diaktifkan. Lihat Tingkat isolasi dan tulis konflik di Azure Databricks.
Untuk apa pengklusteran cairan digunakan?
Databricks merekomendasikan pengelompokan cairan untuk semua tabel Delta baru, yang mencakup Tabel Streaming (ST) dan Tampilan Materialisasi (VM). Berikut adalah contoh beberapa skenario yang mendapat manfaat dari pengklusteran:
- Tabel sering difilter menurut kolom dengan kardinalitas tinggi.
- Tabel dengan kecondongan yang signifikan dalam distribusi data.
- Tabel yang tumbuh dengan cepat dan memerlukan upaya pemeliharaan dan pengoptimalan.
- Tabel dengan kebutuhan penulisan bersamaan.
- Tabel dengan pola akses yang berubah dari waktu ke waktu.
- Tabel di mana kunci partisi tipikal dapat menyebabkan tabel memiliki partisi yang terlalu banyak atau terlalu sedikit.
Mengaktifkan pengklusteran cairan
Anda dapat mengaktifkan pengklusteran cair pada tabel yang ada atau selama pembuatan tabel. Pengklusteran tidak kompatibel dengan partisi atau ZORDER
, dan mengharuskan Anda menggunakan Azure Databricks untuk mengelola semua operasi tata letak dan pengoptimalan untuk data dalam tabel Anda. Setelah klasterisasi data diaktifkan, jalankan OPTIMIZE
tugas seperti biasa untuk mengkluster data secara bertahap. Lihat Cara memicu pengklusteran.
Untuk mengaktifkan pengklusteran cairan, tambahkan CLUSTER BY
frasa ke pernyataan pembuatan tabel, seperti dalam contoh di bawah ini:
Catatan
Di Databricks Runtime 14.2 ke atas, Anda dapat menggunakan API DataFrame dan Api DeltaTable di Python atau Scala untuk mengaktifkan pengklusteran cairan.
SQL
-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);
-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0) -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;
-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;
Python
# Create an empty table
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute())
# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Scala
// Create an empty table
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Di Databricks Runtime 16.0 ke atas, Anda dapat membuat tabel dengan pengklusteran cair yang diaktifkan menggunakan penulisan Streaming Terstruktur, seperti dalam contoh berikut:
Python
(spark.readStream.table("source_table")
.writeStream
.clusterBy("column_name")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
)
Scala
spark.readStream.table("source_table")
.writeStream
.clusterBy("column_name")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Peringatan
Tabel yang dibuat dengan pengklusteran cair diaktifkan memiliki banyak fitur tabel Delta yang diaktifkan saat pembuatan dan menggunakan penulis Delta versi 7 dan pembaca versi 3. Anda dapat mengambil alih pengaktifan beberapa fitur ini. Lihat Mengambil alih pengaktifan fitur default (opsional).
Versi protokol tabel tidak dapat diturunkan tingkatnya, dan tabel dengan pengklusteran diaktifkan tidak dapat dibaca oleh klien Delta Lake yang tidak mendukung semua fitur tabel protokol pembaca Delta yang diaktifkan. Lihat Bagaimana Azure Databricks mengelola kompatibilitas fitur Delta Lake?.
Anda dapat mengaktifkan pengklusteran cair pada tabel Delta yang tidak dipartisi yang ada menggunakan sintaks berikut:
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
Penting
Perilaku default tidak menerapkan pengklusteran ke data yang ditulis sebelumnya. Untuk memaksa pengelompokan ulang semua rekaman, Anda harus menggunakan OPTIMIZE FULL
. Lihat Force reclustering untuk semua rekaman.
Untuk menghapus kunci pengklusteran, gunakan sintaks berikut:
ALTER TABLE table_name CLUSTER BY NONE;
Pengklusteran cairan otomatis
Penting
Pengklusteran cairan otomatis berada dalam Pratinjau Umum.
Di Databricks Runtime 15.4 LTS ke atas, Anda dapat mengaktifkan pengklusteran cairan otomatis untuk tabel terkelola Unity Catalog. Dengan pengklusteran cair otomatis diaktifkan, Azure Databricks dengan cerdas memilih kunci pengklusteran untuk mengoptimalkan performa kueri. Anda mengaktifkan pengklusteran cairan otomatis menggunakan klausa CLUSTER BY AUTO
.
Saat diaktifkan, pemilihan kunci otomatis dan operasi pengklusteran berjalan secara asinkron sebagai operasi pemeliharaan dan mengharuskan pengoptimalan prediktif diaktifkan untuk tabel. Lihat Pengoptimalan prediktif untuk tabel yang dikelola oleh Unity Catalog.
Untuk mengidentifikasi kunci pengklusteran, Azure Databricks menganalisis beban kerja kueri historis untuk tabel dan mengidentifikasi kolom kandidat terbaik. Kunci pengklusteran diubah ketika prediksi penghematan biaya dari peningkatan lompati data melebihi biaya pengklusteran data.
Jika cara Anda mengkueri perubahan data dari waktu ke waktu atau performa kueri menunjukkan perubahan dalam distribusi data Anda, pengklusteran cairan otomatis memilih kunci baru untuk mengoptimalkan performa.
Catatan
Anda dapat membaca atau menulis tabel dengan pengklusteran otomatis diaktifkan dari semua versi Databricks Runtime yang mendukung pengklusteran cairan, tetapi pemilihan kunci cerdas bergantung pada metadata yang diperkenalkan dalam Databricks Runtime 15.4 LTS. Gunakan Databricks Runtime 15.4 LTS atau lebih tinggi untuk memastikan bahwa kunci yang dipilih secara otomatis menguntungkan semua beban kerja Anda dan bahwa beban kerja ini dipertimbangkan saat memilih kunci baru.
Mengaktifkan atau menonaktifkan pengklusteran otomatis
Untuk membuat tabel baru dengan pengklusteran cair otomatis diaktifkan, gunakan sintaks berikut:
CREATE OR REPLACE TABLE table_name CLUSTER BY AUTO;
Anda juga dapat mengaktifkan pengklusteran cairan otomatis pada tabel yang ada, termasuk tabel yang sebelumnya memiliki kunci yang ditentukan secara manual, seperti yang ditunjukkan dalam contoh berikut:
ALTER TABLE table_name CLUSTER BY AUTO;
Anda juga dapat mengubah tabel dengan pengklusteran cairan otomatis yang diaktifkan untuk menggunakan kunci yang ditentukan secara manual.
Catatan
Properti clusterByAuto
diatur ke true
saat Anda mengaktifkan pengklusteran cairan otomatis.
Properti clusteringColumns
menunjukkan kolom pengklusteran saat ini yang dipilih oleh pemilihan kunci otomatis. Jalankan DESCRIBE EXTENDED table_name
untuk melihat daftar lengkap properti tabel.
Mengesampingkan pengaktifan fitur default (opsional)
Anda dapat mengganti perilaku default yang memungkinkan fitur tabel Delta selama pengaktifan pengelompokan cairan. Ini mencegah protokol pembaca dan penulis yang terkait dengan fitur tabel tersebut ditingkatkan. Anda harus memiliki tabel yang sudah ada untuk menyelesaikan langkah-langkah berikut:
Gunakan
ALTER TABLE
untuk mengatur properti tabel yang menonaktifkan satu atau beberapa fitur. Misalnya, untuk menonaktifkan vektor penghapusan, jalankan hal berikut:ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
Aktifkan pengklusteran cairan pada tabel dengan menjalankan hal berikut:
ALTER TABLE <table_name> CLUSTER BY (<clustering_columns>)
Tabel berikut ini menyediakan informasi tentang fitur Delta yang dapat Anda ambil alih dan bagaimana pengaktifan memengaruhi kompatibilitas dengan versi Databricks Runtime.
Fitur Delta | Kompatibilitas runtime | Properti untuk mengesampingkan pengaktifan | Dampak penonaktifan pada pengklusteran cairan |
---|---|---|---|
Vektor penghapusan | Baca dan tulis memerlukan Databricks Runtime 12.2 LTS ke atas. | 'delta.enableDeletionVectors' = false |
Konkurensi tingkat baris dinonaktifkan, membuat transaksi dan operasi pengklusteran lebih mungkin bertentangan. Lihat Menulis konflik dengan konkurensi tingkat baris.DELETE , MERGE , dan UPDATE perintah mungkin berjalan lebih lambat. |
Pelacakan baris | Penulisan memerlukan Databricks Runtime 13.3 LTS ke atas. Dapat dibaca dari versi Databricks Runtime apa pun. | 'delta.enableRowTracking' = false |
Konkurensi tingkat baris dinonaktifkan, membuat transaksi dan operasi pengklusteran lebih mungkin bertentangan. Lihat Menulis konflik dengan konkurensi tingkat baris. |
Titik Pemeriksaan V2 | Baca dan tulis memerlukan Databricks Runtime 13.3 LTS ke atas. | 'delta.checkpointPolicy' = 'classic' |
Tidak ada dampak pada perilaku pengklusteran cairan. |
Pilih kunci pengklusteran
Databricks merekomendasikan pengklusteran cairan otomatis untuk tabel yang didukung. Lihat pengklusteran cairan otomatis.
Databricks merekomendasikan untuk memilih kunci pengklusteran berdasarkan kolom yang paling sering digunakan dalam filter kueri. Kunci pengklusteran dapat didefinisikan dalam urutan apa pun. Jika dua kolom sangat berkorelasi, Anda hanya perlu menyertakan salah satunya sebagai kunci pengklusteran.
Anda dapat menentukan hingga empat kunci pengklusteran. Untuk tabel yang lebih kecil (di bawah 10 TB), menggunakan lebih banyak kunci pengklusteran (misalnya, empat) dapat menurunkan performa saat memfilter pada satu kolom dibandingkan dengan menggunakan lebih sedikit kunci pengklusteran (misalnya, dua). Namun, ketika ukuran tabel meningkat, perbedaan performa dengan menggunakan lebih banyak kunci pengklusteran untuk kueri kolom tunggal menjadi dapat diabaikan.
Anda hanya dapat menentukan kolom yang memiliki statistik yang dikumpulkan sebagai kunci pengklusteran. Secara default, 32 kolom pertama dalam tabel Delta memiliki statistik yang dikumpulkan. Lihat Menentukan kolom statistik Delta.
Pengklusteran mendukung jenis data berikut untuk kunci pengklusteran:
- Tanggal
- Tanda Waktu
- TimestampNTZ (memerlukan Databricks Runtime 14.3 LTS atau lebih tinggi)
- String
- Bilangan bulat
- Panjang
- Pendek
- Mengapung
- Dobel
- Desimal
- Byte
Jika Anda mengonversi tabel yang sudah ada, pertimbangkan rekomendasi berikut:
Teknik pengoptimalan data saat ini | Rekomendasi untuk kunci pengklusteran |
---|---|
Pemartisian gaya Hive | Gunakan kolom partisi sebagai kunci pengklusteran. |
Pengindeksan Z-order |
ZORDER BY Gunakan kolom sebagai kunci pengklusteran. |
Pemartisian gaya Hive dan urutan-Z | Gunakan kolom partisi dan kolom ZORDER BY sebagai kunci pengklusteran. |
Kolom yang dihasilkan untuk mengurangi kardinalitas (misalnya, tanggal untuk tanda waktu) | Gunakan kolom asli sebagai kunci pengklusteran, dan jangan buat kolom yang dihasilkan. |
Menulis data ke tabel berkluster
Anda harus menggunakan klien penulis Delta yang mendukung semua fitur pada tabel protokol penulisan Delta yang digunakan oleh pengelompokan cairan. Di Azure Databricks, Anda harus menggunakan Databricks Runtime 13.3 LTS ke atas.
Operasi yang dikelompokkan saat penulisan meliputi hal-hal berikut:
-
INSERT INTO
Operasi -
CTAS
danRTAS
pernyataan -
COPY INTO
dari format Parquet spark.write.mode("append")
Penulisan data Streaming Terstruktur tidak pernah memicu pengklusteran saat menulis. Batasan tambahan berlaku. Lihat Batasan.
Pengklusteran saat penulisan hanya dipicu ketika data dalam transaksi memenuhi ambang ukuran. Ambang batas ini bervariasi menurut jumlah kolom pengklusteran dan lebih rendah untuk tabel terkelola Katalog Unity daripada tabel Delta lainnya.
Jumlah kolom pengklusteran | Ukuran ambang batas untuk tabel terkelola Katalog Unity | Ukuran ambang batas untuk tabel Delta lainnya |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
4 | 1 GB | 4 GB |
Karena tidak semua operasi menerapkan pengklusteran cairan, Databricks merekomendasikan untuk sering berjalan OPTIMIZE
untuk memastikan bahwa semua data diklusterkan secara efisien.
Cara memicu pengklusteran
Pengoptimalan prediktif secara otomatis menjalankan OPTIMIZE
perintah untuk tabel yang diaktifkan. Lihat pengoptimalan prediktif untuk tabel yang dikelola di Unity Catalog.
Untuk memicu pengklusteran, Anda harus menggunakan Databricks Runtime 13.3 LTS atau lebih tinggi.
OPTIMIZE
Gunakan perintah pada tabel Anda, seperti dalam contoh berikut:
OPTIMIZE table_name;
Pengklusteran cairan bertahap, yang berarti bahwa data hanya ditulis ulang seperlunya untuk mengakomodasi data yang perlu diklusterkan. File data dengan kunci pengklusteran yang tidak cocok dengan data yang akan dikluster tidak ditulis ulang.
Untuk performa terbaik, Databricks merekomendasikan penjadwalan tugas reguler OPTIMIZE
untuk mengelompokkan data. Untuk tabel yang banyak diperbarui atau disisipkan, Databricks merekomendasikan penjadwalan OPTIMIZE
job setiap satu atau dua jam. Karena pengklusteran cairan bersifat inkremental, sebagian besar OPTIMIZE
pekerjaan untuk tabel berkluster berjalan dengan cepat.
Paksa pengelompokan ulang untuk semua catatan
Pada Databricks Runtime 16.0 dan versi yang lebih baru, Anda bisa memaksa penyusunan ulang kluster semua catatan dalam tabel dengan sintaks berikut:
OPTIMIZE table_name FULL;
Penting
Menjalankan OPTIMIZE FULL
mengelompokkan ulang semua data yang ada seperlunya. Untuk tabel besar yang sebelumnya belum diklusterkan pada kunci yang ditentukan, operasi ini mungkin memakan waktu berjam-jam.
Jalankan OPTIMIZE FULL
saat Anda mengaktifkan pengklusteran untuk pertama kalinya atau mengubah kunci pengklusteran. Jika sebelumnya Anda telah menjalankan OPTIMIZE FULL
dan belum ada perubahan pada kunci pengklusteran, OPTIMIZE FULL
berjalan sama dengan OPTIMIZE
. Selalu gunakan OPTIMIZE FULL
untuk memastikan bahwa tata letak data mencerminkan kunci pengklusteran saat ini.
Membaca data dari tabel terkluster
Anda dapat membaca data dalam tabel berkluster menggunakan klien Delta Lake apa pun yang mendukung vektor penghapusan baca. Untuk hasil kueri terbaik, sertakan kunci pengklusteran di filter kueri Anda, seperti dalam contoh berikut:
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
Mengubah kunci pengklusteran
Anda dapat mengubah kunci pengklusteran untuk tabel kapan saja dengan menjalankan ALTER TABLE
perintah, seperti dalam contoh berikut:
ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);
Saat Anda mengubah kunci pengklusteran, operasi berikutnya OPTIMIZE
dan tulis menggunakan pendekatan pengklusteran baru, tetapi data yang ada tidak ditulis ulang.
Anda juga dapat menonaktifkan pengklusteran dengan mengatur kunci ke NONE
, seperti dalam contoh berikut:
ALTER TABLE table_name CLUSTER BY NONE;
Mengatur kunci kluster untuk NONE
tidak menulis ulang data yang telah diklusterkan, tetapi mencegah operasi di masa mendatang OPTIMIZE
menggunakan kunci pengklusteran.
Lihat bagaimana tabel diklusterkan
Anda dapat menggunakan DESCRIBE
perintah untuk melihat kunci pengklusteran untuk tabel, seperti dalam contoh berikut:
DESCRIBE TABLE table_name;
DESCRIBE DETAIL table_name;
Kompatibilitas untuk tabel dengan pengklusteran cair
Tabel yang dibuat dengan pengklusteran cair di Databricks Runtime 14.1 ke atas menggunakan titik pemeriksaan v2 secara default. Anda dapat membaca dan menulis tabel dengan titik pemeriksaan v2 di Databricks Runtime 13.3 LTS ke atas.
Anda dapat menonaktifkan titik pemeriksaan v2 dan menurunkan protokol tabel untuk membaca tabel dengan pengklusteran cair di Databricks Runtime 12.2 LTS ke atas. Lihat Menghilangkan fitur tabel Delta.
Batasan
Keterbatasan berikut ada:
- Di Databricks Runtime 15.1 atau versi sebelumnya, pengklusteran saat penulisan tidak mendukung kueri sumber dengan filter, gabungan, atau agregasi.
- Beban kerja Streaming Terstruktur tidak mendukung pengklusteran saat menulis.
- Di Databricks Runtime 15.4 LTS dan di bawahnya, Anda tidak dapat membuat tabel dengan klastering cair diaktifkan dengan menulis menggunakan Structured Streaming. Anda dapat menggunakan Streaming Terstruktur untuk menulis data ke tabel yang ada dengan pengklusteran cair diaktifkan.