DLA 最近加入了对分区表insert overwrite的支持,这篇文章给您介绍一下。
授权
DLA目前对用户的OSS文件是没有删除权限的,因为insert overwrite需要对分区表中的老数据进行删除,因此需要做有删除数据的权限,因此我们要进行一个授权, 这个授权分两步:
- 创建一个自定义授权策略。
- 把策略授权给DLA的角色。
创建一个自定义授权策略
首先我们访问阿里云RAM的权限策略管理页面, 点击"点击新建权限策略":
输入策略名称,比如 DLADeleteOssObject
, "配置模式"选择 脚本配置
, 贴入如下内容:
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:DeleteObject"
],
"Resource": "acs:oss:*:*:<your-bucket-name>/*",
"Effect": "Allow"
}
]
}
注意: 这里
<your-bucket-name>
要换成你自己使用DLA过程中要用的bucket的名字。
如果你想更细粒度的控制DLA拥有的权限,你可以在这里填上运行DLA删除文件的具体OSS的完整路径 -- 这也是我们推荐的。
把策略授权给DLA的角色
打开RAM角色管理 页面,DLA使用的是一个名叫AliyunOpenAnalyticsAccessingOSSRole
的角色来访问用户的OSS,我们这一步需要把前面创建的策略授权给这个角色, 我们搜索 AliyunOpenAnalyticsAccessingOSSRole
找到这个角色:
点击角色名称上的链接进入详情页面,点击"添加权限":
筛选框里面选择”自定义策略“,找到前面创建的策略,完成授权。
Insert Overwrite!
权限授予完成之后,我们就可以来试一下了, 语法上跟普通的Insert Into类似,只要把INTO
换成OVERWRITE
即可:
mysql> CREATE EXTERNAL TABLE `oss_demo`.`person_test` (
-> `id` int,
-> `name` string,
-> `age` int
-> )
-> PARTITIONED BY (
-> dt string
-> )
-> STORED AS `PARQUET`
-> LOCATION 'oss://test_bucket/datasets/oss_demo/person_test/'
-> TBLPROPERTIES (
-> 'auto.create.location' = 'true'
-> );
Query OK, 0 rows affected (0.52 sec)
mysql> insert into person_test values (1, 'james', 10, '20190101');
+------+
| rows |
+------+
| 1 |
+------+
1 row in set (0.52 sec)
mysql> select * from person_test;
+------+-------+------+----------+
| id | name | age | dt |
+------+-------+------+----------+
| 1 | james | 10 | 20190101 |
+------+-------+------+----------+
1 row in set (0.15 sec)
mysql> insert into person_test values (2, 'bond', 20, '20190101');
+------+
| rows |
+------+
| 1 |
+------+
1 row in set (0.21 sec)
mysql> select * from person_test;
+------+-------+------+----------+
| id | name | age | dt |
+------+-------+------+----------+
| 2 | bond | 20 | 20190101 |
| 1 | james | 10 | 20190101 |
+------+-------+------+----------+
2 rows in set (0.09 sec)
mysql> insert overwrite person_test values (3, 'lily', 30, '20190101');
+------+
| rows |
+------+
| 1 |
+------+
1 row in set (0.61 sec)
mysql> select * from person_test;
+------+------+------+----------+
| id | name | age | dt |
+------+------+------+----------+
| 3 | lily | 30 | 20190101 |
+------+------+------+----------+
1 row in set (0.13 sec)
注意倒数最后两句SQL,在执行了 insert overwrite
之后,表里面的数据被换成了新插入的一条数据。
总结
今天给大家介绍了一下DLA分区表的insert overwrite的功能,如果用户想做一定的ETL清洗,那么insert overwrite的功能还是非常必要的。