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.
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 pengklusteran cair diaktifkan mendukung konkurensi tingkat baris di Databricks Runtime 13.3 LTS 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 pengklusteran cairan untuk semua tabel Delta baru. Berikut adalah contoh beberapa skenario yang mendapat manfaat dari pengklusteran:
- Tabel yang sering difilter menurut kolom kardinalitas tinggi.
- Tabel dengan kecondongan yang signifikan dalam distribusi data.
- Tabel yang tumbuh dengan cepat dan memerlukan upaya pemeliharaan dan penyetelan.
- Tabel dengan kebutuhan tulis konkuren.
- Tabel dengan pola akses yang berubah dari waktu ke waktu.
- Tabel dengan kunci partisi biasa dapat menyebabkan 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 pengklusteran cair diaktifkan, jalankan OPTIMIZE
pekerjaan seperti biasa untuk data kluster 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()
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>)
Mengesampingkan pengaktifan fitur default (opsional)
Anda dapat mengambil alih perilaku default yang memungkinkan fitur tabel Delta selama pengaktifan pengklusteran cair. 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 untuk memilih kunci pengklusteran berdasarkan filter kueri yang umum digunakan. Kunci pengklusteran dapat didefinisikan dalam urutan apa pun. Jika dua kolom berkorelasi, Anda hanya perlu menambahkan salah satunya sebagai kunci pengklusteran.
Anda dapat menentukan hingga 4 kolom sebagai kunci pengklusteran. Anda hanya dapat menentukan kolom dengan statistik yang dikumpulkan untuk 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
- Float
- Laju
- Decimal
- Byte
Jika Anda mengonversi tabel yang sudah ada, pertimbangkan rekomendasi berikut:
Teknik pengoptimalan data saat ini | Rekomendasi untuk kunci pengklusteran |
---|---|
Pemartisian gaya Apache Hive | Gunakan kolom partisi sebagai kunci pengklusteran. |
Pengindeksan Z-order | ZORDER BY Gunakan kolom sebagai kunci pengklusteran. |
Pemartisian gaya Apache Hive dan urutan Z | Gunakan kolom dan ZORDER BY kolom partisi 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 tabel protokol tulis Delta yang digunakan oleh pengklusteran cairan. Di Azure Databricks, Anda harus menggunakan Databricks Runtime 13.3 LTS ke atas.
Operasi yang ditulis kluster meliputi yang berikut ini:
INSERT INTO
OperasiCTAS
pernyataan danRTAS
COPY INTO
dari format Parquetspark.write.mode("append")
Penulisan Streaming Terstruktur tidak pernah memicu pengklusteran saat menulis. Batasan tambahan berlaku. Lihat Batasan.
Pengklusteran pada tulis hanya memicu 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 terkelola 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 pekerjaan reguler OPTIMIZE
ke data kluster. Untuk tabel yang mengalami banyak pembaruan atau penyisipan, Databricks merekomendasikan penjadwalan OPTIMIZE
pekerjaan setiap satu atau dua jam. Karena pengklusteran cairan bersifat inkremental, sebagian besar OPTIMIZE
pekerjaan untuk tabel berkluster berjalan dengan cepat.
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 ke bawah, pengklusteran pada tulis tidak mendukung kueri sumber yang menyertakan filter, gabungan, atau agregasi.
- Beban kerja Streaming Terstruktur tidak mendukung pengklusteran saat menulis.
- Anda tidak dapat membuat tabel dengan pengklusteran cair yang diaktifkan menggunakan penulisan Streaming Terstruktur. Anda dapat menggunakan Streaming Terstruktur untuk menulis data ke tabel yang ada dengan pengklusteran cair diaktifkan.