创建OSS分区表后,可以通过INSERT OVERWRITE重写OSS数据。

在DLA中执行INSERT OVERWRITE重写OSS数据时,DLA需要先删除OSS分区表中的历史数据,然后写入数据。因此,DLA需要有删除OSS文件的权限,通过以下操作为DLA授予删除OSS文件的权限。

步骤一:创建自定义授权策略

  1. 使用DLA实例所属账号登录RAM控制台

  2. 单击权限策略管理>新建权限策略,在新建自定义权限策略页面进行参数配置。

    • 配置模式:选择脚本配置

    • 策略内容:复制以下内容,注意替换您的OSS Bucket名称,如果您需要更细粒度的控制DLA权限,这里可以填写待删除OSS文件的完整路径

      ​{
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "oss:DeleteObject"
                ],
                "Resource": "acs:oss:*:*:<your-bucket-name>/*",
                "Effect": "Allow"
            }
        ]
      }​

步骤二:将授权策略授权给DLA的角色

  1. 单击RAM角色管理,找到RAM角色AliyunOpenAnalyticsAccessingOSSRole

  2. 单击角色名进入角色详情页面,单击添加权限

  3. 在添加权限页面,选择自定义权限策略,找到创建的权限策略,将其授权给DLA的角色AliyunOpenAnalyticsAccessingOSSRole。

写入数据到分区表

步骤一:创建Schema

  1. 登录DLA控制台

  2. 单击左侧导航栏的访问点管理,然后单击登录DMS,执行以下SQL创建OSS Schema。

    您也可以通过MySQL客户端或者程序代码等方式连接DLA,然后执行以下SQL创建OSS Schema。

​CREATE SCHEMA dla_oss_demo with DBPROPERTIES(
 catalog='oss',
 location= 'oss://oss-bucket-name/dla/'
 );​
  • catalog:指定创建的Schema类型为OSS。

  • location:文件所在的OSS Bucket目录,需以/结尾。

步骤二:创建分区表

​CREATE EXTERNAL TABLE dla (
    prod_name string,
    cnt bigint)
PARTITIONED BY (y string, m string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE
LOCATION 'oss://bucket-name/dla/';​

假设OSS文件的存储路径为:

  • https://bucket-name.oss-cn-hangzhou.aliyuncs.com/dla/y=2019/m=3/cnt.txt

  • https://bucket-name.oss-cn-hangzhou.aliyuncs.com/dla/y=2018/m=12/cnt2.txt

步骤三:执行MSCK命令更新分区信息

MSCK REPAIR TABLE dla;

步骤四:执行SHOW PARTITIONS命令查看分区信息

​show partitions dla;
+-----------+
| y=2018/m=12|
| y=2019/m=2 |​

步骤五:查询分区表数据

​select * from dla;
+---------------------------+
|prod_name | cnt | y  |  m  |
+---------------------------+
|鼠标      | 1   |2019 |  3  |
|显示器    | 2   |2019 |  3  |
|键盘      | 4   |2019 |  3  |
|办公桌    | 100 |2018 |  12 |
|椅子      | 150 |2018 |  12 |​

步骤六:向分区表插入一条数据

​insert into dla values ("硬盘",10,"2019","3");
+---------------------------+
select * from dla;
+---------------------------+
|prod_name | cnt | y  |  m  |
+---------------------------+
|硬盘      | 10  |2019 |  3  |
|鼠标      | 1   |2019 |  3  |
|显示器    | 2   |2019 |  3  |
|键盘      | 4   |2019 |  3  |
|办公桌    | 100 |2018 |  12 |
|椅子      | 150 |2018 |  12 |​

步骤七:执行INSERT OVERWRITE向分区表插入数据

​insert overwrite dla values ("电脑",10,"2019","3");
select * from dla;
+---------------------------+
|prod_name | cnt | y  |  m  |
+---------------------------+
|电脑      | 10  |2019 |  3  |
|办公桌    | 100 |2018 |  12 |
|椅子      | 150 |2018 |  12 |​

执行INSERT OVERWRITE后,表中的数据更新为新插入的一条数据。OSS Bucket中dla/y=2018/m=12/目录下的数据无变化,而dla/y=2019/m=3/目录中cnt.txt文件已被删除,仅剩INSERT OVERWRITE插入的一条数据。