當前Delta Table支援對部分列進行更新。即對錶執行插入或更新操作時,只需要在SQL中指定您想修改的目標列及其新資料,而無需包含表中的所有列。插入資料時,未被賦值的列會自動被填充為NULL;更新資料時,未被賦值的列保持不變。在多數情境下可大幅提升執行效率,節省儲存成本。本文用具體樣本為您展示如何在Delta Table中插入或更新部分列的資料。
例如某些典型的數倉業務中包含一些星型模式的資料表,表主鍵相同,需要將所有資料表按照主鍵合并為一張大寬表,用於後續的計算和統計,不同的資料表完全可以單獨並發寫入與其相關的列,互不影響,讀取大寬表時再將其合并成完整的資料行進行輸出,相比只能寫入所有列的用法,部分列更新可以極大地提升寫入和讀取的效能,也能節省儲存成本。
注意事項
表類型必須為Delta Table。
支援分區表和非分區表。
執行前您需要開啟支援部分列更新的開關
SET odps.sql.upsertable.table.enable=true;
,預設已開啟。
SQL樣本
樣本資料
建立Delta Table表delta_target
:
CREATE TABLE delta_target
(
key BIGINT NOT NULL PRIMARY KEY,
b STRING,
c BIGINT
)
TBLPROPERTIES ("acid.partial.fields.update.enable" = "true","transactional" = "true")
;
INSERT OVERWRITE/INSERT INTO
此處以樣本資料為例,為您展示在Delta Table中,如何使用INSERT OVERWRITE/INSERT INTO插入部分列資料。
預設
c
列,c
列自動補充為NULL。INSERT INTO TABLE delta_target(key, b) VALUES(1, '1'); SELECT * FROM delta_target;
返回結果:
+------------+------------+------------+ | key | b | c | +------------+------------+------------+ | 1 | 1 | NULL | +------------+------------+------------+
預設
b
列,插入相同主鍵資料,相當於更新當前資料。INSERT INTO TABLE delta_target(key, c) VALUES(1, 1); SELECT * FROM delta_target;
返回結果:
+------------+------------+------------+ | key | b | c | +------------+------------+------------+ | 1 | 1 | 1 | +------------+------------+------------+
預設
c
列,插入相同主鍵資料,相當於更新當前資料。INSERT INTO TABLE delta_target(key, b) VALUES(1, '11'); SELECT * FROM delta_target;
返回結果:
+------------+------------+------------+ | key | b | c | +------------+------------+------------+ | 1 | 11 | 1 | +------------+------------+------------+
不預設,插入資料與當前主鍵不同,即新增一條資料。
INSERT INTO TABLE delta_target VALUES(2, '2', 2); SELECT * FROM delta_target;
返回結果:
+------------+------------+------------+ | key | b | c | +------------+------------+------------+ | 2 | 2 | 2 | | 1 | 11 | 1 | +------------+------------+------------+
更多關於INSERT OVERWRITE/INSERT INTO的資訊請參見插入或覆寫資料(INSERT INTO | INSERT OVERWRITE)。
UPDATE/DELETE
本文在INSERT OVERWRITE/INSERT INTO樣本的基礎上,為您展示如何使用UPDATE/DELETE更新部分列資料。
預設
c
列,更新key=1的資料行。UPDATE delta_target SET b='111' WHERE key=1; SELECT * FROM delta_target;
返回結果:
+------------+------------+------------+ | key | b | c | +------------+------------+------------+ | 2 | 2 | 2 | | 1 | 111 | 1 | +------------+------------+------------+
預設
c
列,更新key=2的資料行。UPDATE delta_target SET b='222' WHERE key=2; SELECT * FROM delta_target;
返回結果:
+------------+------------+------------+ | key | b | c | +------------+------------+------------+ | 2 | 222 | 2 | | 1 | 111 | 1 | +------------+------------+------------+
更多關於UPDATE/DELETE的資訊請參見更新或刪除資料(UPDATE | DELETE)。
MERGE INTO
本文在UPDATE/DELETE樣本的基礎上,為您展示如何使用MERGE INTO合并資料。
-- 建立acid2_dml_pu_source表
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 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);
返回結果:
+------------+------------+------------+
| key | b | c |
+------------+------------+------------+
| 3 | 30 | NULL |
| 4 | 40 | NULL |
| 5 | 50 | NULL |
| 6 | 60 | NULL |
| 2 | 20 | 2 |
| 1 | 10 | 1 |
+------------+------------+------------+
更多關於MERGE INTO的資訊請參見MERGE INTO。