Menggunakan pengklusteran cairan untuk tabel Delta

Penting

Pengklusteran cairan Delta Lake tersedia di Pratinjau Umum di Databricks Runtime 13.3 ke atas. Beberapa dukungan untuk pengklusteran cairan ada di Databricks Runtime 12.2 LTS ke atas. Lihat Kompatibilitas untuk tabel dengan pengklusteran cairan.

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.

Peringatan

Databricks Runtime 13.3 LTS ke atas diperlukan untuk membuat, menulis, atau OPTIMIZE tabel Delta dengan pengklusteran cair diaktifkan.

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 kluster cair pada tabel yang ada atau selama pembuatan tabel. Pengklusteran tidak kompatibel dengan partisi atau ZORDER, dan mengharuskan klien Azure Databricks mengelola semua operasi tata letak dan pengoptimalan untuk data dalam tabel Anda. Setelah diaktifkan, jalankan OPTIMIZE pekerjaan 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) USING DELTA 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.format("delta").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.format("delta").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?.

Di Databricks Runtime 13.3 LTS ke atas, Anda dapat mengaktifkan pengklusteran cairan 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:

  1. 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);
    
  2. 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.

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
  • Boolean

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.

Sebagian besar operasi tidak secara otomatis mengkluster data saat menulis. Operasi yang ditulis kluster meliputi yang berikut ini:

  • INSERT INTO Operasi
  • Pernyataan CTAS
  • COPY INTO dari format Parquet
  • spark.write.format("delta").mode("append")

Catatan

Pengklusteran pada tulis adalah aplikasi upaya terbaik, dan tidak diterapkan dalam situasi berikut:

  • Jika operasi tulis melebihi data 512GB.
  • Jika subkueri SELECT berisi transformasi, filter, atau gabungan.
  • Jika kolom yang diproyeksikan tidak sama dengan tabel sumber.

Karena tidak semua operasi menerapkan pengklusteran cairan, Databricks merekomendasikan untuk sering berjalan OPTIMIZE untuk memastikan bahwa semua data diklusterkan secara efisien.

Cara memicu pengklusteran

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

Databricks merekomendasikan penggunaan Databricks Runtime 13.3 LTS atau lebih tinggi untuk semua beban kerja yang membaca atau menulis dari tabel dengan pengklusteran cair diaktifkan.

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:

  • Anda hanya dapat menentukan kolom dengan statistik yang dikumpulkan untuk kunci pengklusteran. Secara default, 32 kolom pertama dalam tabel Delta memiliki statistik yang dikumpulkan.
  • Anda dapat menentukan hingga 4 kolom sebagai kunci pengklusteran.
  • Beban kerja Streaming Terstruktur tidak mendukung pengklusteran saat menulis.