背景
对于大数据中的大多数存储格式,支持随机更新非常复杂。它需要扫描大型文件,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开发者社区钉钉群,或点击链接 申请加入。