背景
对于大数据中的大多数存储格式,支持随机更新非常复杂。它需要扫描大型文件,MaxCompute推出了最新的功能Transactional表可以支持update和delete语句,但是update和delete功能不适用于高频更新、删除数据或实时写入目标表场景,同时对于非Transactional表无法执行update和delete。本文主要讲解如何通过insert overwrite更新数据。
1.建表插入数据
createtable update_table(ID int, tranValue string, last_update_user string) PARTITIONED by(dt STRING ) LIFECYCLE 1;INSERTINTO 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.更新多条数据
根据增量表更新,首先创建增量表插入数据
createtable update_table_inc(ID int, TranValue string, last_update_user string) LIFECYCLE 1;INSERTINTO 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.idand b.TranValueisnotnull THEN b.TranValue ELSE a.TranValue END TranValue ,CASE WHEN a.id=b.idand b.TranValueisnotnull 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.idWHERE a.dt="20210510";
4.删除数据
--删除数据INSERT OVERWRITE TABLE update_table PARTITION( dt)SELECT*FROM update_table WHERE dt ="20210510"and id !=4;
大家如果对MaxCompute有更多咨询或者建议,欢迎扫码加入 MaxCompute开发者社区钉钉群,或点击链接 申请加入。