MaxCompute meningkatkan format Tabel Delta Append dengan dukungan Hash Cluster, yang meningkatkan performa kueri sekaligus memungkinkan pemrosesan data inkremental. Artikel ini mencakup perbedaan dari jenis tabel lainnya, detail sintaksis, serta contoh penggunaan untuk SQL dan SDK Data Tunnel.
Kasus Penggunaan
Hash Cluster direkomendasikan untuk skenario berikut:
Kueri filter kesamaan: Gunakan untuk pencarian titik (point lookups) atau filter kesamaan pada kolom tertentu guna mengurangi pemindaian data.
Operasi equi-join dan GROUP BY: Kurangi pengacakan data saat melakukan join atau agregasi beberapa tabel berdasarkan kunci yang sama.
Perbandingan dengan jenis tabel serupa
Jenis Tabel | Metode Pengelompokan | Penulisan Inkremental (ACID) | |
Hash | Tidak didukung | Menyediakan optimasi Pengelompokan Hash (Shuffle + Sort) tetapi tidak mendukung ACID. | |
Hash | Didukung | Menawarkan kemampuan ACID dan optimasi Pengelompokan Hash. Cocok untuk data dengan primary key. Performa baca dan tulis lebih rendah dibandingkan tabel tanpa primary key. | |
Range | Didukung | Menawarkan kemampuan ACID dan mendukung recluster, tetapi metode pengelompokan Range-nya menghasilkan performa tulis lebih rendah dibandingkan Hash. | |
Tabel Delta Append - Hash Cluster | Hash | Didukung | Menggabungkan optimasi Pengelompokan Hash (Shuffle + Sort) dengan kemampuan ACID penuh. Fitur ini juga mendukung recluster inkremental maupun penuh di latar belakang, menjadikannya opsi paling lengkap. |
Prasyarat
Sebelum membuat tabel, aktifkan parameter sesi berikut:
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true; -- Mengaktifkan fitur percobaan untuk membuat tabel delta hash.Sintaksis
CREATE TABLE [IF NOT EXISTS] <table_name>
[(<col_name> <data_type> [comment <col_comment>], ...)]
[PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...)]
CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [, <col_name>, ...])] -- Hanya urutan ascending yang didukung.
INTO <number_of_buckets> BUCKETS
TBLPROPERTIES ('table.format.version' = '2'); Parameter
Parameter | Deskripsi |
| Menentukan kolom bucketing. Pilih kolom yang sering digunakan dalam kueri filter kesamaan, equi-join, GROUP BY, atau klausa WINDOW PARTITION BY . Untuk hasil terbaik, pilih kolom dengan kardinalitas tinggi agar distribusi data merata di seluruh bucket. |
| Opsional. Menentukan kolom pengurutan dalam setiap bucket. Saat ini hanya urutan ascending yang didukung. Disarankan memilih kolom yang digunakan untuk filter range atau kesamaan, perhitungan window, atau timestamp versi. |
| Menentukan jumlah bucket logis. Disarankan menetapkan angka ini berdasarkan volume data, konkurensi kueri, dan kardinalitas kolom bucketing Anda. Jumlah bucket memengaruhi paralelisme operasi tulis dan optimasi shuffle selama operasi baca. |
| Atur ke |
Contoh SQL
Contoh ini menggunakan tabel status produk dan versi harga. Dalam logika bisnis, pencarian titik atau join biasanya dilakukan pada produk berdasarkan item_id. Oleh karena itu, item_id ditetapkan sebagai kolom bucketing hash. Waktu efektif versi, event_time, digunakan untuk melacak perubahan historis, sehingga event_time ditetapkan sebagai kolom pengurutan. Desain ini cocok untuk skenario seperti tabel Slowly Changing Dimension (SCD), tabel versi harga produk, dan tabel detail perubahan status.
Persiapan
SET odps.sql.type.system.odps2=true;
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true;Buat tabel
Tabel non-partisi
CREATE TABLE hash_delta_sales_demo (
item_id BIGINT,
event_time TIMESTAMP,
price DOUBLE,
status STRING
)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');Tabel partisi
Jika Anda perlu mengelola data berdasarkan tanggal, Anda juga dapat membuat tabel partisi:
CREATE TABLE hash_delta_sales_demo_pt (
item_id BIGINT,
event_time TIMESTAMP,
price DOUBLE,
status STRING
)
PARTITIONED BY (ds STRING)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');Jalankan DESC EXTENDED hash_delta_sales_demo; untuk melihat informasi tabel. Definisi bucketing dan pengurutan tabel adalah sebagai berikut:
ClusterType: hash
BucketNum: 256
ClusterColumns: [item_id]
SortColumns: [event_time ASC]Penulisan inkremental
Contoh berikut menggunakan tabel non-partisi untuk menunjukkan penulisan inkremental dan recluster.
Penulisan data awal
INSERT INTO TABLE hash_delta_sales_demo VALUES (1001, TIMESTAMP '2026-05-01 10:00:00', 10.00, 'active'), (1001, TIMESTAMP '2026-05-03 10:00:00', 13.00, 'active'), (1002, TIMESTAMP '2026-05-01 11:00:00', 20.00, 'active'); DESC EXTENDED hash_delta_sales_demo;Operasi Delete
Periksa status tabel setelah menghapus beberapa data:
DELETE FROM hash_delta_sales_demo WHERE item_id = 1002; DESC EXTENDED hash_delta_sales_demo;Mengisi ulang data historis
Mengisi ulang versi historis. Nilai event_time versi ini berada di antara timestamp yang sudah ada untuk item_id=1001:
INSERT INTO TABLE hash_delta_sales_demo VALUES (1001, TIMESTAMP '2026-05-02 09:00:00', 12.00, 'active'); DESC EXTENDED hash_delta_sales_demo;
Pemangkasan Bucket
Saat Anda menjalankan kueri filter kesamaan pada kolom bucketing, MaxCompute menggunakan distribusi hash untuk langsung menemukan bucket target, sehingga menghindari pemindaian semua bucket lainnya. Kueri berikut menyaring berdasarkan item_id = 1001 dan hanya membaca bucket logis yang berisi nilai tersebut, menghindari pemindaian tabel penuh:
SELECT * FROM hash_delta_sales_demo
WHERE item_id = 1001
ORDER BY event_time
LIMIT 10;
-- Returns:
+------------+---------------------+------------+--------+
| item_id | event_time | price | status |
+------------+---------------------+------------+--------+
| 1001 | 2026-05-01 10:00:00 | 10.0 | active |
| 1001 | 2026-05-02 09:00:00 | 12.0 | active |
| 1001 | 2026-05-03 10:00:00 | 13.0 | active |
+------------+---------------------+------------+--------+Recluster penuh
Jika Anda perlu mengatur ulang data yang sudah ada, jalankan RECLUSTER FULL. Operasi ini mempertahankan semantik data historis dalam tabel dan mengatur ulang data yang tersimpan sesuai definisi tabel saat ini.
ALTER TABLE hash_delta_sales_demo RECLUSTER FULL;
DESC EXTENDED hash_delta_sales_demo;Tabel Delta Append dengan Hash Cluster mendukung operasi penulisan inkremental seperti INSERT, UPDATE, DELETE, dan MERGE INTO, sekaligus mempertahankan distribusi hash. Pengoptimal memilih rencana eksekusi berdasarkan kondisi data saat ini. Pengoptimal memanfaatkan penyimpanan terurut saat data tersusun rapi, dan kembali menggunakan bucketing hash saat data tidak sepenuhnya terurut. Anda dapat menjalankan RECLUSTER FULL kapan saja untuk mengembalikan urutan pengurutan penuh.
Contoh SDK Data Tunnel
Bagian ini menunjukkan cara menggunakan SDK Data Tunnel untuk mengunggah dan mengunduh data dari tabel hash_delta_sales_demo.
Impor dependensi SDK
Gunakan versi 0.59 atau yang lebih baru. Untuk detailnya, lihat Catatan Rilis.
Kode contoh
FAQ
Memilih ukuran penyimpanan bucket
Ukuran penyimpanan yang direkomendasikan untuk satu bucket berkisar antara beberapa ratus megabyte hingga puluhan gigabyte.
Bucket kecil meningkatkan overhead penyimpanan dan biaya pengacakan.
Bucket besar memperpanjang waktu penulisan dan mengurangi efektivitas Pemangkasan Bucket serta optimasi pengacakan.
Tetapkan jumlah bucket berdasarkan perkiraan pertumbuhan data, bukan hanya volume saat ini, untuk menghindari modifikasi struktur tabel yang sering.
Jika volume data Anda sangat besar, satu bucket dapat mendukung penyimpanan lebih besar, atau Anda dapat menetapkan jumlah bucket yang lebih tinggi. Namun, Anda harus mengevaluasi dampaknya terhadap performa tulis dan kueri berdasarkan kasus penggunaan spesifik Anda.