Penulisan berulang pada tabel delta menghasilkan banyak file kecil yang menurunkan Throughput I/O dan meningkatkan tekanan penyimpanan. Compaction menggabungkan semua file data menjadi satu set file dasar yang terkonsolidasi, hanya menyimpan versi terbaru dari setiap baris sehingga kueri memindai lebih sedikit file dan berjalan lebih cepat.
Ikhtisar
Tabel delta mendukung dua metode penggabungan data:
| Metode | Apa yang dilakukan | Pemicu |
|---|---|---|
| Clustering | Hanya menggabungkan file delta menjadi file yang lebih besar tanpa mengubah konten data. File delta berisi data dari operasi yang telah dikomit. | Otomatis — sistem menjalankan clustering secara berkala berdasarkan ukuran dan jumlah file. Tidak diperlukan tindakan manual. |
| Compaction | Menggabungkan semua file data menjadi sejumlah file dasar. Untuk baris dengan primary key yang sama, hanya baris terbaru yang dipertahankan. Versi baris historis dan data kolom sistem tidak disimpan. | Manual — jalankan ALTER TABLE ... COMPACT MAJOR. |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Tabel delta (dibuat dengan
tblproperties ("transactional"="true")) -
Properti session
odps.merge.task.mode=serviceyang telah diatur dalam session Anda
Sintaksis
ALTER TABLE <table_name>
[PARTITION (<partition_key> = '<partition_value>' [, ...])]
COMPACT MAJOR;
Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
table_name |
Ya | Nama tabel delta yang akan dikompaksi. |
partition_key |
Tidak | Nama kunci partisi. Tentukan untuk mengompaksi satu partisi saja. |
partition_value |
Tidak | Nilai kunci partisi. |
Catatan penggunaan
-
Properti session wajib: Atur
odps.merge.task.mode=servicesebelum menjalankan compaction.SET odps.merge.task.mode=service; -
Biaya penyimpanan: Compaction menghasilkan file dasar baru sebelum menghapus yang lama, sehingga penggunaan penyimpanan meningkat sementara. Anda dapat mengonfigurasi frekuensi pemicu berdasarkan kebutuhan bisnis Anda.
-
Amplifikasi tulis dan konflik: Kebijakan compaction dirancang untuk mencegah amplifikasi tulis yang serius dan kegagalan akibat konflik dalam skenario compaction yang sering dilakukan.
Penagihan
| Metode penagihan | Cara penagihan compaction |
|---|---|
| Pay-as-you-go | Jumlah data yang dipindai × 1 × harga satuan |
| Subscription | Dipotong dari kuota komputasi langganan |
Contoh
Contoh berikut membuat tabel delta berpartisi, memasukkan data dalam tiga batch, menjalankan compaction, lalu melakukan kueri terhadap data historis menggunakan time travel.
-- Buat tabel delta dengan primary key dan dua kolom partisi.
CREATE TABLE mf_dt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL)
PARTITIONED BY (dd STRING, hh STRING)
TBLPROPERTIES ("transactional"="true");
-- Masukkan data dalam tiga batch untuk mensimulasikan tulisan inkremental.
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (1, 1), (2, 2);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (2, 20), (3, 3);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (3, 30), (4, 4);
-- Jalankan compaction pada partisi tersebut.
SET odps.merge.task.mode=service;
ALTER TABLE mf_dt PARTITION(dd='01', hh='01') COMPACT MAJOR;
-- Lakukan kueri terhadap snapshot terbaru setelah compaction.
SELECT * FROM mf_dt TIMESTAMP AS OF get_latest_timestamp('mf_dt')
WHERE dd='01' AND hh='01';
-- Lakukan kueri terhadap snapshot kedua terbaru (time travel tetap berfungsi setelah compaction).
SELECT * FROM mf_dt TIMESTAMP AS OF get_latest_timestamp('mf_dt', 2)
WHERE dd='01' AND hh='01';