# 从DLI导入表数据到DWS集群
本实践演示使用DWS外表功能从**数据湖探索服务DLI** 导入数据到**DWS数据仓库**的过程。
了解DLI请参见[数据湖产品介绍](https://support.huaweicloud.com/productdesc-dli/dli_01_0378.html)。
本实践预计时长60分钟，实践用到的云服务包括**虚拟私有云 VPC及子网** 、**数据湖探索 DLI** 、**对象存储服务 OBS** 和**数据仓库服务 DWS，**基本流程如下：
1. [准备工作]
2. [步骤一：准备DLI源端数据]
3. [步骤二：创建DWS集群]
4. [步骤三：获取DWS外部服务器所需鉴权信息]。
5. [步骤四：通过外表导入DLI表数据]
 #### 准备工作
- 已注册华为云账号，具体请参见[注册华为云账号](https://support.huaweicloud.com/usermanual-account/account_id_001.html)，且在使用DWS 前检查账号状态，账号不能处于欠费或冻结状态。
- 已创建虚拟私有云和子网，参见[创建虚拟私有云和子网](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0013935842.html)。
- 已获取华为云账号的AK和SK，参见[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
 
 #### 步骤一：准备DLI源端数据
1. 创建DLI弹性资源池及队列。 
   1. 登录[华为云DLI控制台](https://console.huaweicloud.com/dli/#/main/dashboard)。
   
   2. 左侧导航栏选择"资源管理 \> 弹性资源池"，进入弹性资源池管理页面。
   
   3. 单击右上角"购买弹性资源池"，填写如下参数，其他参数项如表中未说明，默认即可。
      表1DLI弹性资源池 
      | 参数项  | 参数值              |
      |:---|:---|
      | 计费模式 | 按需计费             |
      | 区域  | 华北-北京四          |
      | 名称   | dli_dws          |
      | 规格  | 基础版             |
      | 网段  | 172.16.0.0/18。 |
         
      
   
   4. 单击"立即购买"，单击"提交"。 等待资源池创建成功，继续执行下一步。
      
   
   5. 在弹性资源池页面，单击创建好的资源池所在行右侧的"添加队列"，填写如下参数，其他参数项如表中未说明，默认即可。
      表2添加队列 
      | 参数项 | 参数值    |
      |:---|:---|
      | 名称    | dli_dws |
      | 类型   | SQL队列     |
         
      
   
   6. 单击"下一步"，单击"确定"。队列创建成功。
   
   
   
   
2. 上传源数据到OBS桶。 
   1. 已创建OBS桶，桶名自定义，例如dli-obs01（如果桶名已被占用，可设为dli-obs02，依次叠加），区域选择华北-北京四。
   
   2. 下载[数据样例文件](https://dws-lab01.obs.cn-north-4.myhuaweicloud.com/dli_data/order.parquet)。
   
   3. 在OBS桶中，新建文件夹dli_order，并将下载好的数据文件上传到dli_order目录下。
   
   
   
   
3. 回到DLI管理控制台，左侧导航单击"SQL编辑器"，队列选择"dli_dws"，数据库选择"default"，执行以下命令创建名为"dli_data"的数据库。 
   ```
   CREATE DATABASE dli_data;
   ```
   
   
4. 创建表。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   以下LOCATION为数据文件实际存放的OBS目录，格式为obs://obs桶名/文件夹名称，本例为obs://dli-obs01/dli_order，如果桶名或文件夹名称有修改，请自行替换。
   ```
   CREATE EXTERNAL TABLE dli_data.dli_order
        ( order_id      VARCHAR(12),
          order_channel VARCHAR(32),
          order_time    TIMESTAMP,
          cust_code     VARCHAR(6),
          pay_amount    DOUBLE,
          real_pay      DOUBLE ) 
   STORED AS parquet
   LOCATION 'obs://dli-obs01/dli_order';
   ```
   
   
5. 执行以下语句查询数据，结果显示查询成功。 
   ```
   SELECT * FROM dli_data.dli_order;
   ```
   
   
 
 #### 步骤二：创建DWS集群
1. [创建集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html)，同时为确保网络连通，本实践DWS集群的区域，选择为"华北-北京四"。
 
 #### 步骤三：获取DWS外部服务器所需鉴权信息
1. 获取OBS桶的终端节点。
   
   1. 登录[OBS控制台](https://console.huaweicloud.com/obs)。
   
   2. 单击桶名称，左侧选择"概览"，并记录终端节点。 ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002093213481.png "点击放大")
      
      
      
   
   
   
   
2. 访问[终端节点](https://support.huaweicloud.com/api-dli/dli_02_0174.html)获取DLI的终端节点。
   
   本例（华北-北京四）为dli.cn-north-4.myhuaweicloud.com。
   
   
   
3. 获取创建DLI所使用的账号的特定区域的项目ID。
   
   1. 鼠标悬浮在右上方的账户名，单击"我的凭证"。
   
   2. 左侧选择"API凭证"。
   
   3. 从列表中，找到DLI所属区域，本例为华北-北京四，记录区域名所在的项目ID。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002093284445.png "点击放大")
   
   
   
4. 获取账号的AK和SK，参见[准备工作]。
 
 #### 步骤四：通过外表导入DLI表数据
1. 使用系统管理员dbadmin用户登录DWS数据库，默认登录gaussdb数据库即可。
2. 执行以下SQL创建外部Server。其中OBS终端节点从[1]获取，AK和SK从[准备工作]获取，DLI终端节点从[2]获取。
   
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   如果DWS和DLI是同一个账户创建下，则AK和SK分别填写一次。
   ```
   CREATE SERVER dli_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS 
        ( ADDRESS 'OBS终端节点', 
          ACCESS_KEY 'AK值', 
          SECRET_ACCESS_KEY 'SK值', 
          TYPE 'DLI',
          DLI_ADDRESS 'DLI终端节点',
          DLI_ACCESS_KEY 'AK值',
          DLI_SECRET_ACCESS_KEY 'SK值'
        );
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002060100762.png "点击放大")
   
   
   
3. 执行以下SQL创建目标schema。 
   ```
   CREATE SCHEMA dws_data;
   ```
   
   
4. 执行以下SQL创建外表。其中项目ID替换为[3]获取的实际值。
   
   ```
   CREATE FOREIGN TABLE dws_data.dli_pq_order (
     order_id VARCHAR(14) PRIMARY KEY NOT ENFORCED,
     order_channel VARCHAR(32),
     order_time TIMESTAMP,
     cust_code VARCHAR(6),
     pay_amount DOUBLE PRECISION,
     real_pay DOUBLE PRECISION
   )
   SERVER dli_server
   OPTIONS (
     FORMAT 'parquet',
     ENCODING 'utf8',
     DLI_PROJECT_ID '项目ID',
     DLI_DATABASE_NAME 'dli_data',
     DLI_TABLE_NAME 'dli_order')
   DISTRIBUTE BY roundrobin;
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002096170665.png "点击放大")
   
   
   
5. 执行以下SQL，通过外表查询DLI的表数据。 
   结果显示，成功访问DLI表数据。
   ```
   SELECT * FROM dws_data.dli_pq_order;
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002096174325.png "点击放大")
   
   
   
6. 执行以下SQL，创建一张新的本地表，用于导入DLI表数据。 
   ```
   CREATE TABLE dws_data.dws_monthly_order
        ( order_month       CHAR(8),
          cust_code         VARCHAR(6),
          order_count       INT,
          total_pay_amount  DOUBLE PRECISION,
          total_real_pay    DOUBLE PRECISION );
   ```
   
   
7. 执行以下SQL，查询出2023年的月度订单明细，并将结果导入DWS表。 
   ```
   INSERT INTO dws_data.dws_monthly_order
        ( order_month, cust_code, order_count     
        , total_pay_amount, total_real_pay )
   SELECT TO_CHAR(order_time, 'MON-YYYY'), cust_code, COUNT(*)
        , SUM(pay_amount), SUM(real_pay)
     FROM dws_data.dli_pq_order
    WHERE DATE_PART('Year', order_time) = 2023
   GROUP BY TO_CHAR(order_time, 'MON-YYYY'), cust_code;
   ```
   
   
8. 执行以下SQL查询表数据。 
   结果显示，DLI表数据成功导入DWS数据库。
   ```
   SELECT * FROM dws_data.dws_monthly_order;
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002059984544.png "点击放大")
   
   
   
 
