如何用SQL对MaxCompute数据进行修改和删除
2017-03-15 10:52
483 查看
原文链接:http://click.aliyun.com/m/13931/
MaxCompute SQL不支持对数据的Update和Delete操作,但是实际工作中可能确实有一些场景需要这样处理,怎么办呢?实际上,MaxCompute SQL的Insert语法支持Insert Into/Overwrite两种数据导入的方式。分别对应数据导入的追加写入和覆盖写入两种场景。追加写入比较容易理解,覆盖写入是指,如果覆盖写入的表是非分区表,那就清空这个表的内容然后用新的结果覆盖进去。如果是非分区表,那就清空相关的分区,然后重新写入数据。本文就各种场景下的的解决方法做一个说明。
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=20160101ds=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 |+------------+------------+------------+------------+------------+------------+------------+------------+总的看来,这些都不是太有难度的东西,都只是一些比较常用的小技巧。希望这些小技巧能帮助到大家,让工作变得更加有效率。在最后还是提醒大家,在工作中为避免误操作,尽量避免直接对数据进行直接的修改和删除,建议是创建一张新的表,把结果表进过加工后写入新的表。写入结束核对好了数据后,再把数据导过来。请务必注意数据备份!
相关文章推荐
- 如何用SQL对MaxCompute数据进行修改和删除
- 如何用SQL对MaxCompute数据进行修改和删除
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据[转]
- SQL如何进行增加、删除、改写、查询等数据操作
- 如何实现对项目中的数据进行删除、修改的功能?
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- 使用SQL语句对表进行插入、修改和删除数据操作
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- 如何使用LINQ to SQL插入、修改、删除数据
- 用sql进行表的插入数据行,空白行,删除行,修改行
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据 (转)
- 如何将VFP本地表数据传送到SQL-Server后台进行更新
- ORACLE中如何用一条SQL语句删除一个表中所有某个列的值为空的数据?
- 用LINQ to SQL 进行数据访问、更新和删除(附Demo示例程序下载)