目标:使用aws cli命令,删除athena表中的记录。
aws athena管理的表中是不支持 updata,delete操作的;甚至下面操作也是不允许的:
truncate table testdb.testtable;
insert overwrite table testdb.testtable select * from [other_table or current_table];
insert into table testdb.testtable select * from [other_table or current_table];
需要说明的是,使用spark编写的程序运行在EMR集群上是可以执行insert overrite的hive sql语句的;但我们的目标是使用aws cli 命令来达到删除表记录的目的。
================================================================================
通过网上搜索,找到了以下处理办法:
增加红色设置创建的表,可以支持update,delete等操作;但实际使用时发现,该功能只在指定的地区提供。
以下是网络搜索后,采用的更通用的办法(aws 术语:Creating a Table from Query Results (CTAS)),
具体实施步骤如下:
1. s3上建立一个临时文件夹,专用于存放临时表对应的数据库文件
每次执行前都需将该文件夹下的文件清空,否则临时表会建立失败;
由于没有文件了,所以tmp_for_update文件夹也会被删除,没有关系,下面操作会自动创建文件夹的
aws s3 rm s3://xxx/yyy/tmp_for_update/ --recursive
2. 使用 aws athena 命令执行下面的操作,具体命令形式请上网搜索:
下面的命令将创建一张名为tmp_for_update的表,表中内容是testdb.testtable表中内容的子集(根据条件过滤了部分记录)
CREATE TABLE testdb.tmp_for_update
WITH (
external_location = 's3://xxx/yyy/tmp_for_update',
parquet_compression = 'lzo')
AS select * from testdb.testtable where [Filter conditions];
3. 将原表对应的数据文件删除;再拷入临时表中的数据文件
aws s3 rm s3://xxx/yyy/testtable/ --recursive
aws s3 mv s3://xxx/yyy/tmp_for_update s3://xxx/yyy/testtable/ --recursive
此时原表中再查看,满足指定条件的记录已经不存在了
4.使用aws athena命令对临时表进行清理
drop table dw_rec_db.tmp_for_update;
aws s3 rm s3://rec-collect/db/tmp_for_update/ --recursive
本文档介绍如何使用AWS CLI在不支持更新和删除操作的Athena表中删除记录。通过创建临时表(CTAS)并利用数据迁移,实现了类似删除的效果。首先清空S3上的临时文件夹,然后使用Athena创建临时表,并从原始表中选择部分记录。接着删除原表数据并拷贝临时表数据到原表位置。最后,清理临时表和文件夹,完成记录删除过程。
237

被折叠的 条评论
为什么被折叠?



