从DLI导入表数据到GaussDB(DWS)集群
本实践演示使用GaussDB(DWS)外表功能从数据湖探索服务DLI导入数据到GaussDB(DWS)数据仓库的过程。
了解DLI请参见数据湖产品介绍。
本实践预计时长60分钟,实践用到的云服务包括虚拟私有云 VPC及子网、数据湖探索 DLI、对象存储服务 OBS和数据仓库服务 GaussDB(DWS),基本流程如下:
准备工作
- 已注册华为账号并开通华为云,具体请参见注册华为账号并开通华为云,且在使用GaussDB(DWS) 前检查账号状态,账号不能处于欠费或冻结状态。
- 已创建虚拟私有云和子网,参见创建虚拟私有云和子网。
- 已获取华为账号的AK和SK,参见访问密钥。
步骤一:准备DLI源端数据
- 创建DLI弹性资源池及队列。
- 登录华为云控制台,服务列表选择“大数据 > 数据湖探索DLI”,进入DLI管理控制台。
- 左侧导航栏选择“资源管理 > 弹性资源池”,进入弹性资源池管理页面。
- 单击右上角“购买弹性资源池”,填写如下参数,其他参数项如表中未说明,默认即可。
表1 DLI弹性资源池 参数项
参数值
计费模式
按需计费
区域
华北-北京四
名称
dli_dws
规格
基础版
网段
172.16.0.0/18。
- 单击“立即购买”,单击“提交”。
- 在弹性资源池页面,单击创建好的资源池所在行右侧的“添加队列”,填写如下参数,其他参数项如表中未说明,默认即可。
表2 添加队列 参数项
参数值
名称
dli_dws
类型
SQL队列
- 单击“下一步”,单击“确定”。队列创建成功。
- 上传源数据到OBS桶。
- 已创建OBS桶,桶名自定义,例如dli-obs01(如果桶名已被占用,可设为dli-obs02,依次叠加),区域选择华北-北京四。
- 下载数据样例文件。
- 在OBS桶中,新建文件夹dli_order,并将下载好的数据文件上传到dli_order目录下。
- 回到DLI管理控制台,左侧导航单击“SQL编辑器”,队列选择“dli_dws”,数据库选择“deafult”,执行以下命令创建名为“dli_data”的数据库。
1
CREATE DATABASE dli_data;
- 创建表。
以下LOCATION为数据文件实际存放的OBS目录,格式为obs://obs桶名/文件夹名称,本例为obs://dli-obs01/dli_order,如果桶名或文件夹名称有修改,请自行替换。
1 2 3 4 5 6 7 8 9
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';
- 执行以下语句查询数据,结果显示查询成功。
1
SELECT * FROM dli_data.dli_order;
步骤四:通过外表导入DLI表数据
- 使用系统管理员dbadmin用户登录GaussDB(DWS)数据库,默认登录gaussdb数据库即可。
- 执行以下SQL创建外部Server。其中OBS终端节点从1获取,AK和SK从准备工作获取,DLI终端节点从2获取。
如果DWS和DLI是同一个账户创建下,则AK和SK分别对应重复填写一次。
1 2 3 4 5 6 7 8 9
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值' );
- 执行以下SQL创建目标schema。
1
CREATE SCHEMA dws_data;
- 执行以下SQL创建外表。其中项目ID替换为3获取的实际值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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;
- 执行以下SQL,通过外表查询DLI的表数据。
结果显示,成功访问DLI表数据。
1
SELECT * FROM dws_data.dli_pq_order;
- 执行以下SQL,创建一张新的本地表,用于导入DLI表数据。
1 2 3 4 5 6
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 );
- 执行以下SQL,查询出2023年的月度订单明细,并将结果导入DWS表。
1 2 3 4 5 6 7 8
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;
- 执行以下SQL查询表数据。
结果显示,DLI表数据成功导入DWS数据库。
1
SELECT * FROM dws_data.dws_monthly_order;