天天看点

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

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

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

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

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

如果需要删除某个非分区表,使用 <code>truncate table table_name;</code>删除这个表里的全部数据

如果需要删除的是分区表里的数据,需要<code>alter table table_name drop partition;</code>的方式将这个分区删掉从而实现删除对应的分区里的数据(分区连同分区里的数据一起被删除)。

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

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

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