如何用SQL对MaxCompute数据进行修改和删除

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: MaxCompute SQL不支持对数据的Update和Delete操作,但是实际工作中可能确实有一些场景需要这样处理,怎么办呢?本文就各种场景下的的解决方法做一个说明。 特别提醒大家,在工作中为避免误操作,尽量避免直接对数据进行直接的修改和删除,建议是创建一张新的表,把结果表进过加工后写入新的表

MaxCompute SQL不支持对数据的Update和Delete操作,但是实际工作中可能确实有一些场景需要这样处理,怎么办呢?实际上,MaxCompute SQL的Insert语法支持Insert Into/Overwrite两种数据导入的方式。分别对应数据导入的追加写入和覆盖写入两种场景。追加写入比较容易理解,覆盖写入是指,如果覆盖写入的表是非分区表,那就清空这个表的内容然后用新的结果覆盖进去。如果是非分区表,那就清空相关的分区,然后重新写入数据。本文就各种场景下的的解决方法做一个说明。

Update

从前面的描述可以看到,Insert Overwrite的就是一个现成的Update功能,我们要Update不正是要用Update后的结果来覆盖Update前的结果吗。所以我们可以把需要Update后的结果Select出来,然后Insert Overwrite回去,就能实现了Update的结果了。这里用几个简单的例子来说明下方便理解:

--元数据
+------------+------------+------------+------------+------------+------------+------------+------------+
| empno      | ename      | job        | mgr        | hiredate   | sal        | comm       | deptno     |
+------------+------------+------------+------------+------------+------------+------------+------------+
| 7499       | ALLEN      | SALESMAN   | 7698     | 1981-02-20 00:00:00 | 1600.0     | 300.0      | 30       |
| 7521       | WARD       | SALESMAN   | 7698     | 1981-02-22 00:00:00 | 1250.0     | 500.0      | 30       |
| 7654       | MARTIN     | SALESMAN   | 7698     | 1981-09-28 00:00:00 | 1250.0     | 1400.0     | 30       |
| 7698       | BLAKE      | MANAGER    | 7839     | 1981-05-01 00:00:00 | 2850.0     | NULL       | 30       |
| 7782       | CLARK      | MANAGER    | 7839     | 1981-06-09 00:00:00 | 2450.0     | NULL       | 10       |
| 7844       | TURNER     | SALESMAN   | 7698     | 1981-09-08 00:00:00 | 1500.0     | 0.0        | 30       |
| 7900       | JAMES      | CLERK      | 7698     | 1981-12-03 00:00:00 | 950.0      | NULL       | 30       |
| 7902       | FORD       | ANALYST    | 7566     | 1981-12-03 00:00:00 | 3000.0     | NULL       | 20       |
| 7788       | SCOTT      | ANALYST    | 7566     | 1987-07-13 01:00:00 | 3000.0     | NULL       | 20       |
| 7876       | ADAMS      | CLERK      | 7788     | 1987-07-13 01:00:00 | 1100.0     | NULL       | 20       |
+------------+------------+------------+------------+------------+------------+------------+------------+

--原SQL
Update Table emp Set comm  = 0 where comm is null;
--新SQL
--其实这里有个内建函数coalesce会更简单,但是用case when比较容易理解
Insert Overwrite table emp Select empno,ename, job,mgr,hiredate,sal,case when comm is null then 0.0 else comm end as comm,deptno from emp;

+------------+------------+------------+------------+------------+------------+------------+------------+
| empno      | ename      | job        | mgr        | hiredate   | sal        | comm       | deptno     |
+------------+------------+------------+------------+------------+------------+------------+------------+
| 7698       | BLAKE      | MANAGER    | 7839     | 1981-05-01 00:00:00 | 2850.0     | 0.0        | 30       |
| 7788       | SCOTT      | ANALYST    | 7566     | 1987-07-13 01:00:00 | 3000.0     | 0.0        | 20       |
| 7782       | CLARK      | MANAGER    | 7839     | 1981-06-09 00:00:00 | 2450.0     | 0.0        | 10       |
| 7902       | FORD       | ANALYST    | 7566     | 1981-12-03 00:00:00 | 3000.0     | 0.0        | 20       |
| 7876       | ADAMS      | CLERK      | 7788     | 1987-07-13 01:00:00 | 1100.0     | 0.0        | 20       |
| 7900       | JAMES      | CLERK      | 7698     | 1981-12-03 00:00:00 | 950.0      | 0.0        | 30       |
| 7499       | ALLEN      | SALESMAN   | 7698     | 1981-02-20 00:00:00 | 1600.0     | 300.0      | 30       |
| 7654       | MARTIN     | SALESMAN   | 7698     | 1981-09-28 00:00:00 | 1250.0     | 1400.0     | 30       |
| 7844       | TURNER     | SALESMAN   | 7698     | 1981-09-08 00:00:00 | 1500.0     | 0.0        | 30       |
| 7521       | WARD       | SALESMAN   | 7698     | 1981-02-22 00:00:00 | 1250.0     | 500.0      | 30       |
+------------+------------+------------+------------+------------+------------+------------+------------+

如果是分区表的数据需要修改数据的话,就套用分区表的Insert语法和Select语法,都是一样的道理,就不一一举例了。

Delete

Delete删除数据,分为是要删除某个表或者分区里的全部数据,还是只是删除一部分的数据。

删除全部数据

如果需要删除某个非分区表,使用 TRUNCATE TABLE table_name;删除这个表里的全部数据

如果需要删除的是分区表里的数据,需要ALTER TABLE table_name DROP PARTITION;的方式将这个分区删掉从而实现删除对应的分区里的数据(分区连同分区里的数据一起被删除)。

odps@ aliyun2014>show partitions partition_table;

ds=20160101
ds=20160102

OK
odps@ aliyun2014>alter table partition_table drop if exists partition(ds='20160102');
Confirm to "alter table partition_table drop if exists partition(ds='20160102');" (yes/no)? yes

OK
>show partitions partition_table;

ds=20160101

OK

删除部分数据

删除部分数据,就是指通过where语句过滤,只删除部分数据的情况。Delete也是用Insert Overwrite来实现的。如果需要删除一部分的数据,那其实就是覆盖写入剩下的数据。如果要删除全部的数据,那就是覆盖写入空数据。这里还是只提到普通表的例子,和Update一样,普通表和分区表的区别,就是Insert的时候,需要指定修改的分区,或者使用动态分区。

--数据集使用上个例子的Update之前的emp进行操作
--原SQL 希望删除里面的job为SALESMAN的记录
Delete from emp where comm >500;
--新SQL,注意对空值的处理,一些常见下可以考虑用Union all
Insert Overwrite Table Emp Select * From Emp Where  comm <=500 or comm is null;

--结果集
+------------+------------+------------+------------+------------+------------+------------+------------+
| empno      | ename      | job        | mgr        | hiredate   | sal        | comm       | deptno     |
+------------+------------+------------+------------+------------+------------+------------+------------+
| 7698       | BLAKE      | MANAGER    | 7839     | 1981-05-01 00:00:00 | 2850.0     | NULL       | 30       |
| 7788       | SCOTT      | ANALYST    | 7566     | 1987-07-13 01:00:00 | 3000.0     | NULL       | 20       |
| 7782       | CLARK      | MANAGER    | 7839     | 1981-06-09 00:00:00 | 2450.0     | NULL       | 10       |
| 7902       | FORD       | ANALYST    | 7566     | 1981-12-03 00:00:00 | 3000.0     | NULL       | 20       |
| 7876       | ADAMS      | CLERK      | 7788     | 1987-07-13 01:00:00 | 1100.0     | NULL       | 20       |
| 7900       | JAMES      | CLERK      | 7698     | 1981-12-03 00:00:00 | 950.0      | NULL       | 30       |
| 7499       | ALLEN      | SALESMAN   | 7698     | 1981-02-20 00:00:00 | 1600.0     | 300.0      | 30       |
| 7844       | TURNER     | SALESMAN   | 7698     | 1981-09-08 00:00:00 | 1500.0     | 0.0        | 30       |
| 7521       | WARD       | SALESMAN   | 7698     | 1981-02-22 00:00:00 | 1250.0     | 500.0      | 30       |
+------------+------------+------------+------------+------------+------------+------------+------------+

总的看来,这些都不是太有难度的东西,都只是一些比较常用的小技巧。希望这些小技巧能帮助到大家,让工作变得更加有效率。

在最后还是提醒大家,在工作中为避免误操作,尽量避免直接对数据进行直接的修改和删除,建议是创建一张新的表,把结果表进过加工后写入新的表。写入结束核对好了数据后,再把数据导过来。请务必注意数据备份!

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
2月前
|
机器学习/深度学习 传感器 分布式计算
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
189 14
|
3月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
780 43
|
3月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。
278 0
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
|
3月前
|
机器学习/深度学习 运维 监控
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
151 0
|
2月前
|
SQL 存储 分布式计算
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
本文旨在帮助非专业数据研发但是有高频ODPS使用需求的同学们(如数分、算法、产品等)能够快速上手ODPS查询优化,实现高性能查数看数,避免日常工作中因SQL任务卡壳、失败等情况造成的工作产出delay甚至集群资源稳定性问题。
1021 36
【万字长文,建议收藏】《高性能ODPS SQL章法》——用古人智慧驾驭大数据战场
|
2月前
|
传感器 人工智能 监控
数据下田,庄稼不“瞎种”——聊聊大数据如何帮农业提效
数据下田,庄稼不“瞎种”——聊聊大数据如何帮农业提效
142 14
|
1月前
|
传感器 人工智能 监控
拔俗多模态跨尺度大数据AI分析平台:让复杂数据“开口说话”的智能引擎
在数字化时代,多模态跨尺度大数据AI分析平台应运而生,打破数据孤岛,融合图像、文本、视频等多源信息,贯通微观与宏观尺度,实现智能诊断、预测与决策,广泛应用于医疗、制造、金融等领域,推动AI从“看懂”到“会思考”的跃迁。
|
2月前
|
机器学习/深度学习 传感器 监控
吃得安心靠数据?聊聊用大数据盯紧咱们的餐桌安全
吃得安心靠数据?聊聊用大数据盯紧咱们的餐桌安全
109 1
|
2月前
|
数据采集 自动驾驶 机器人
数据喂得好,机器人才能学得快:大数据对智能机器人训练的真正影响
数据喂得好,机器人才能学得快:大数据对智能机器人训练的真正影响
210 1

热门文章

最新文章

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 下一篇
    oss云网关配置