Geniş bir tabloya sütun sütun yazma işlemi, her INSERT veya UPDATE işleminde tüm sütunların belirtilmesini gerektirdiğinden maliyetlidir. Kısmi sütun güncellemesi bu kısıtlamayı ortadan kaldırır: Yalnızca değiştirmek istediğiniz sütunları belirtin, MaxCompute geri kalanını işlem türüne göre otomatik olarak yönetir.
Çalışma Mantığı
Belirtilmeyen sütunların davranışı, kullanılan işleme bağlıdır:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bu ayrım, içselleştirilmesi gereken en önemli davranıştır: INSERT eksik sütunları NULL ile doldururken, UPDATE ve WHEN MATCHED durumlarında bu sütunlar dokunulmadan bırakılır.
Kullanım Senaryoları
En yaygın kullanım senaryosu, yıldız şemasından geniş tablolar oluşturmaktır. Birden fazla kaynak tablo aynı birincil anahtarı paylaştığında, her kaynak tablonun sütunlarını bağımsız ve paralel olarak geniş tabloya yazabilirsiniz. Okuma sırasında MaxCompute, satırları birincil anahtara göre birleştirir ve tam kayıtları döndürür. Tüm sütunları tek bir işlemde yazmakla karşılaştırıldığında, bu yaklaşım yazma ve okuma performansını artırır ve depolama maliyetlerini azaltır.
Ön Koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Kısmi sütun güncellemesinin etkinleştirildiği bir Delta tablosu (bkz. Delta tablosu oluşturma)
MaxCompute DML deyimlerine aşinalık: INSERT INTO, UPDATE, DELETE ve MERGE INTO
Delta Tablosu Oluşturma
Kısmi sütun güncellemesini etkinleştirmek için tablo oluştururken iki tablo özelliğini ayarlayın:
CREATE TABLE delta_target
(
key BIGINT NOT NULL PRIMARY KEY,
b STRING,
c BIGINT
)
TBLPROPERTIES (
"acid.partial.fields.update.enable" = "true",
"transactional" = "true"
);
Hem acid.partial.fields.update.enable hem de transactional özellikleri "true" olarak ayarlanmalıdır. Bölümlenmiş ve bölümlenmemiş tabloların her ikisi de desteklenir.
Belirli Sütunlara Veri Ekleme
Sütunların bir alt kümesine değer yazmak için INSERT INTO kullanın. Sütun listesinde belirtilmeyen sütunlar NULL olarak ayarlanır. Zaten var olan bir birincil anahtara sahip bir satır eklediğinizde, MaxCompute yalnızca belirtilen sütunları günceller ve geri kalanını değiştirmez; bu, ekleme yoluyla kısmi güncelleme anlamına gelir.
Örnek 1: c sütunu atlanarak yeni bir satır ekleme
c sütunu listelenmediği için NULL olarak ayarlanır.
INSERT INTO TABLE delta_target(key, b) VALUES(1, '1');
SELECT * FROM delta_target;
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 1 | 1 | NULL |
+------------+------------+------------+
Örnek 2: Belirli bir sütunu güncellemek için yinelenen birincil anahtara sahip bir satır ekleme
key=1 değerine sahip bir satır zaten mevcuttur. Aynı birincil anahtarla ekleme yapmak, belirtilen sütunu (c) günceller ve belirtilmeyen sütunu (b) değiştirmez.
INSERT INTO TABLE delta_target(key, c) VALUES(1, 1);
SELECT * FROM delta_target;
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 1 | 1 | 1 |
+------------+------------+------------+
Örnek 3: c değişmeden bırakılırken başka bir sütunu güncelleme
c sütunu listelenmediği için mevcut 1 değerini korur.
INSERT INTO TABLE delta_target(key, b) VALUES(1, '11');
SELECT * FROM delta_target;
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 1 | 11 | 1 |
+------------+------------+------------+
Örnek 4: Yeni bir birincil anahtara sahip bir satır ekleme
Birincil anahtar henüz mevcut değilse, yeni bir satır eklenir.
INSERT INTO TABLE delta_target VALUES(2, '2', 2);
SELECT * FROM delta_target;
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 2 | 2 | 2 |
| 1 | 11 | 1 |
+------------+------------+------------+
Daha fazla bilgi için bkz. Tabloya veya statik bölüme veri ekleme veya üzerine yazma (INSERT INTO ve INSERT OVERWRITE).
Mevcut Satırlardaki Belirli Sütunları Güncelleme
Eşleşen satırlardaki belirli sütunları değiştirmek için UPDATE kullanın. SET yan tümcesinde listelenmeyen sütunlar değiştirilmez.
Örnek 1: c değişmeden bırakılırken key=1 için b sütununu güncelleme
UPDATE delta_target SET b='111' WHERE key=1;
SELECT * FROM delta_target;
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 2 | 2 | 2 |
| 1 | 111 | 1 |
+------------+------------+------------+
Örnek 2: c değişmeden bırakılırken key=2 için b sütununu güncelleme
UPDATE delta_target SET b='222' WHERE key=2;
SELECT * FROM delta_target;
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 2 | 222 | 2 |
| 1 | 111 | 1 |
+------------+------------+------------+
Daha fazla bilgi için bkz. UPDATE ve DELETE.
Kaynak Verileri Belirli Sütunlara Birleştirme
Yalnızca belirli sütunları hedefleyerek verileri upsert (ekle/güncelle) etmek için MERGE INTO kullanın. WHEN MATCHED yan tümcesinde yalnızca listelenen sütunlar güncellenir; diğerleri değiştirilmez. WHEN NOT MATCHED yan tümcesinde, listelenmeyen sütunlar NULL olarak ayarlanır.
Aşağıdaki örnekte bir kaynak tablo oluşturulur ve delta_target tablosuna birleştirilir. Birleştirme işlemi, eşleşen satırlar için b sütununu günceller ve yeni satırlar için (key, b) değerlerini ekler; her iki durumda da c sütununa yazılmaz.
-- 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);
Sonuç:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 3 | 30 | NULL |
| 4 | 40 | NULL |
| 5 | 50 | NULL |
| 6 | 60 | NULL |
| 2 | 20 | 2 |
| 1 | 10 | 1 |
+------------+------------+------------+
3-6 arasındaki satırlar yeni eklemelerdir: c sütunu belirtilmediği için NULL değerindedir. 1 ve 2 numaralı satırlar eşleşmiştir: b sütunu güncellenmiş ve c sütunu önceki değerini korumuştur.
Daha fazla bilgi için bkz. MERGE INTO.