Menulis ke tabel lebar secara kolom per kolom mahal jika setiap operasi INSERT atau UPDATE harus menentukan semua kolom. Pembaruan kolom parsial mengatasi kendala tersebut: cukup tentukan kolom yang ingin diubah, dan MaxCompute akan menangani sisanya secara otomatis berdasarkan jenis operasinya.
Cara kerja
Perilaku untuk kolom yang tidak ditentukan bergantung pada jenis operasi:
Operation | Unspecified columns |
INSERT INTO / INSERT OVERWRITE | Set to NULL |
UPDATE | Left unchanged |
MERGE INTO (WHEN MATCHED UPDATE SET) | Left unchanged |
MERGE INTO (WHEN NOT MATCHED INSERT) | Set to NULL |
Perbedaan utama yang perlu dipahami adalah: INSERT mengisi kolom yang tidak disebutkan dengan NULL, sedangkan UPDATE dan WHEN MATCHED membiarkannya tetap tidak berubah.
Kasus penggunaan
Kasus penggunaan paling umum adalah membangun tabel lebar dari skema bintang. Ketika beberapa tabel sumber berbagi primary key yang sama, kolom masing-masing tabel sumber dapat ditulis ke tabel lebar secara independen dan paralel. Saat dibaca, MaxCompute menggabungkan baris berdasarkan primary key dan mengembalikan catatan lengkap. Pendekatan ini meningkatkan performa penulisan dan pembacaan serta mengurangi biaya penyimpanan dibandingkan dengan menulis semua kolom dalam satu operasi.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Tabel Delta dengan pembaruan kolom parsial yang diaktifkan (lihat Buat tabel Delta)
Memahami pernyataan DML MaxCompute: INSERT INTO, UPDATE, DELETE, dan MERGE INTO
Create a Delta table
Untuk mengaktifkan partial column update, atur dua properti tabel berikut saat membuat tabel:
CREATE TABLE delta_target
(
key BIGINT NOT NULL PRIMARY KEY,
b STRING,
c BIGINT
)
TBLPROPERTIES (
"acid.partial.fields.update.enable" = "true",
"transactional" = "true"
);Kedua properti acid.partial.fields.update.enable dan transactional harus diatur ke "true". Fitur ini mendukung baik tabel partisi maupun non-partisi.
Insert data into specific columns
Gunakan INSERT INTO untuk menulis nilai ke subset kolom. Kolom yang tidak tercantum dalam daftar kolom akan diatur ke NULL. Jika Anda memasukkan baris dengan primary key yang sudah ada, MaxCompute hanya memperbarui kolom yang ditentukan dan membiarkan kolom lainnya tidak berubah—ini secara efektif merupakan pembaruan parsial melalui insert.
Contoh 1: Masukkan baris baru, mengabaikan kolom `c`
Kolom c tidak tercantum, sehingga diatur ke NULL.
INSERT INTO TABLE delta_target(key, b) VALUES(1, '1');
SELECT * FROM delta_target;Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 1 | 1 | NULL |
+------------+------------+------------+Contoh 2: Masukkan baris dengan primary key duplikat untuk memperbarui kolom tertentu
Baris dengan key=1 sudah ada. Memasukkan baris dengan primary key yang sama memperbarui kolom yang ditentukan (c) dan membiarkan kolom yang tidak ditentukan (b) tetap tidak berubah.
INSERT INTO TABLE delta_target(key, c) VALUES(1, 1);
SELECT * FROM delta_target;Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 1 | 1 | 1 |
+------------+------------+------------+Contoh 3: Perbarui kolom lain sambil mempertahankan nilai `c`
Kolom c tidak tercantum, sehingga mempertahankan nilai saat ini yaitu 1.
INSERT INTO TABLE delta_target(key, b) VALUES(1, '11');
SELECT * FROM delta_target;Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 1 | 11 | 1 |
+------------+------------+------------+Contoh 4: Masukkan baris dengan primary key baru
Jika primary key belum ada, baris baru akan dimasukkan.
INSERT INTO TABLE delta_target VALUES(2, '2', 2);
SELECT * FROM delta_target;Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 2 | 2 | 2 |
| 1 | 11 | 1 |
+------------+------------+------------+Untuk informasi lebih lanjut, lihat Insert data into or overwrite data in a table or a static partition (INSERT INTO and INSERT OVERWRITE).
Update specific columns in existing rows
Gunakan UPDATE untuk mengubah kolom tertentu pada baris yang sesuai. Kolom yang tidak tercantum dalam klausa SET dibiarkan tidak berubah.
Contoh 1: Perbarui kolom `b` untuk `key=1`, biarkan `c` tidak berubah
UPDATE delta_target SET b='111' WHERE key=1;
SELECT * FROM delta_target;Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 2 | 2 | 2 |
| 1 | 111 | 1 |
+------------+------------+------------+Contoh 2: Perbarui kolom `b` untuk `key=2`, biarkan `c` tidak berubah
UPDATE delta_target SET b='222' WHERE key=2;
SELECT * FROM delta_target;Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 2 | 222 | 2 |
| 1 | 111 | 1 |
+------------+------------+------------+Untuk informasi lebih lanjut, lihat UPDATE and DELETE.
Merge source data into specific columns
Gunakan MERGE INTO untuk melakukan upsert data sambil hanya menargetkan kolom tertentu. Dalam klausa WHEN MATCHED, hanya kolom yang tercantum yang diperbarui; kolom lainnya dibiarkan tidak berubah. Dalam klausa WHEN NOT MATCHED, kolom yang tidak tercantum diatur ke NULL.
Contoh berikut membuat tabel sumber dan menggabungkannya ke delta_target. Penggabungan ini memperbarui kolom b untuk baris yang cocok dan memasukkan (key, b) untuk baris baru—kolom c tidak ditulis dalam kedua kasus tersebut.
-- Create a source table with six rows
CREATE TABLE acid2_dml_pu_source AS
SELECT key, b, c
FROM VALUES
(1, '10', 10),
(2, '20', 20),
(3, '30', 30),
(4, '40', 40),
(5, '50', 50),
(6, '60', 60) t (key, b, c);
-- Merge: update b for matching rows, insert (key, b) for new rows
MERGE INTO delta_target AS t
USING acid2_dml_pu_source AS s ON s.key = t.key
WHEN MATCHED THEN
UPDATE SET t.b = s.b
WHEN NOT MATCHED THEN
INSERT (key, b) VALUES(s.key, s.b);Hasil:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 3 | 30 | NULL |
| 4 | 40 | NULL |
| 5 | 50 | NULL |
| 6 | 60 | NULL |
| 2 | 20 | 2 |
| 1 | 10 | 1 |
+------------+------------+------------+Baris 3–6 merupakan insert baru: kolom c bernilai NULL karena tidak ditentukan. Baris 1 dan 2 cocok: kolom b diperbarui dan c mempertahankan nilai sebelumnya.
Untuk informasi lebih lanjut, lihat MERGE INTO.