MaxCompute非事务表如何更新数据

简介: 本文主要讲解如何通过insert overwrite更新数据

背景

对于大数据中的大多数存储格式,支持随机更新非常复杂。它需要扫描大型文件,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
;

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

posted @ 2021-07-16 10:08  阿里云云栖号  阅读(400)  评论(0编辑  收藏  举报