背景
對于大資料中的大多數存儲格式,支援随機更新非常複雜。它需要掃描大型檔案,MaxCompute推出了最新的功能Transactional表可以支援update和delete語句,但是update和delete功能不适用于高頻更新、删除資料或實時寫入目标表場景,同時對于非Transactional表無法執行update和delete。本文主要講解如何通過insert overwrite更新資料。
1.建表插入資料
create table update_table(ID int,
tranValue string,
last_update_user string) PARTITIONED by(dt STRING ) LIFECYCLE 1;
INSERT INTO update_table PARTITION (dt="20210510") VALUES
(1, 'value_01', 'creation'),
(2, 'value_02', 'creation'),
(3, 'value_03', 'creation'),
(4, 'value_04', 'creation'),
(5, 'value_05', 'creation'),
(6, 'value_06', 'creation'),
(7, 'value_07', 'creation'),
(8, 'value_08', 'creation'),
(9, 'value_09', 'creation'),
(10, 'value_10','creation');
2.更新一條資料
當id是1的時候更新成value_011
--更新一條資料
INSERT OVERWRITE TABLE update_table PARTITION( dt)
SELECT id
,CASE WHEN id=1 THEN "value_011"
ELSE TranValue
END TranValue
,last_update_user
,dt
FROM update_table
WHERE dt = "20210510"
;
3.更新多條資料
根據增量表更新,首先建立增量表插入資料
create table update_table_inc(ID int,
TranValue string,
last_update_user string) LIFECYCLE 1;
INSERT INTO update_table_inc VALUES
(5, 'value_11', 'creation'),
(6, NULL, '20170410'),
(7, 'value22', '20170413');
id是5和7更新TranValue,由于6的TranValue是null不更新
INSERT OVERWRITE TABLE update_table PARTITION( dt)
SELECT a.id
,CASE WHEN a.id=b.id and b.TranValue is not null THEN b.TranValue
ELSE a.TranValue
END TranValue
,CASE WHEN a.id=b.id and b.TranValue is not null THEN b.last_update_user
ELSE a.last_update_user
END last_update_user
,dt
FROM update_table a
LEFT JOIN update_table_inc b
ON a.id = b.id
WHERE a.dt = "20210510"
;
4.删除資料
--删除資料
INSERT OVERWRITE TABLE update_table PARTITION( dt)
SELECT *
FROM update_table
WHERE dt = "20210510" and id !=4
;
大家如果對MaxCompute有更多咨詢或者建議,歡迎掃碼加入 MaxCompute開發者社群釘釘群,或點選
連結申請加入。
