全部产品
云市场

OSS分区表INSERT OVERWRITE

更新时间:2019-04-19 17:10:19

本文介绍如何在OSS分区表中通过INSERT OVERWRITE重写OSS数据。

前提条件

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

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

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

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

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

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

      1. {
      2. "Version": "1",
      3. "Statement": [
      4. {
      5. "Action": [
      6. "oss:DeleteObject"
      7. ],
      8. "Resource": "acs:oss:*:*:<your-bucket-name>/*",
      9. "Effect": "Allow"
      10. }
      11. ]
      12. }

      新建策略

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

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

    搜索权限

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

    添加权限

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

    授权成功

操作步骤

步骤一:创建OSS Schema

  1. CREATE SCHEMA dla_oss_demo with DBPROPERTIES(
  2. catalog='oss',
  3. location= 'oss://bucket-name/dla/'
  4. );

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

步骤二:创建OSS分区表

  1. CREATE EXTERNAL TABLE dla (
  2. prod_name string,
  3. cnt bigint)
  4. PARTITIONED BY (y string, m string)
  5. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  6. STORED AS TEXTFILE
  7. LOCATION 'oss://bucket-name/dla/';

OSS中文件的存储路径为:

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

    cnt

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

    cnt2

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

  1. MSCK REPAIR TABLE dla;

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

  1. show partitions dla;
  2. +-----------+
  3. | y=2018/m=12|
  4. | y=2019/m=2 |

步骤五:查询分区表数据

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

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

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

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

  1. insert overwrite dla values ("电脑",10,"2019","3");
  2. select * from dla;
  3. +---------------------------+
  4. |prod_name | cnt | y | m |
  5. +---------------------------+
  6. |电脑 | 10 |2019 | 3 |
  7. |办公桌 | 100 |2018 | 12 |
  8. |椅子 | 150 |2018 | 12 |

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

执行insert overwrite

未删除oss