DLA支持分区表的INSERT OVERWRITE

原文链接: https://yq.aliyun.com/articles/699640

DLA支持分区表的INSERT OVERWRITE_第1张图片

DLA 最近加入了对分区表insert overwrite的支持,这篇文章给您介绍一下。

授权

DLA目前对用户的OSS文件是没有删除权限的,因为insert overwrite需要对分区表中的老数据进行删除,因此需要做有删除数据的权限,因此我们要进行一个授权, 这个授权分两步:

  1. 创建一个自定义授权策略。
  2. 把策略授权给DLA的角色。

创建一个自定义授权策略

首先我们访问阿里云RAM的权限策略管理页面, 点击"点击新建权限策略":

DLA支持分区表的INSERT OVERWRITE_第2张图片

输入策略名称,比如 DLADeleteOssObject , "配置模式"选择 脚本配置 , 贴入如下内容:

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "oss:DeleteObject"
            ],
            "Resource": "acs:oss:*:*:/*",
            "Effect": "Allow"
        }
    ]
}

注意: 这里 要换成你自己使用DLA过程中要用的bucket的名字。
如果你想更细粒度的控制DLA拥有的权限,你可以在这里填上运行DLA删除文件的具体OSS的完整路径 -- 这也是我们推荐的。

把策略授权给DLA的角色

打开RAM角色管理 页面,DLA使用的是一个名叫AliyunOpenAnalyticsAccessingOSSRole 的角色来访问用户的OSS,我们这一步需要把前面创建的策略授权给这个角色, 我们搜索 AliyunOpenAnalyticsAccessingOSSRole 找到这个角色:

DLA支持分区表的INSERT OVERWRITE_第3张图片

点击角色名称上的链接进入详情页面,点击"添加权限":

DLA支持分区表的INSERT OVERWRITE_第4张图片

筛选框里面选择”自定义策略“,找到前面创建的策略,完成授权。

DLA支持分区表的INSERT OVERWRITE_第5张图片

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的功能还是非常必要的。

Happy DLAing

你可能感兴趣的:(DLA支持分区表的INSERT OVERWRITE)