本文为您介绍如何将MaxCompute分区表数据导入到Hologres分区表。
前提条件
- 已购买并开通Hologres实例,开通方法请参见购买Hologres。
- 已开通MaxCompute并创建项目,详情请参见开通MaxCompute 。
- 已开通DataWorks服务并创建DataWorks工作空间,详情请参见创建工作空间。
背景信息
通过Hologres中的MaxCompute外表方式向Hologres导入数据是非常常见的数据导入模式。在日常工作中会经常需要进行数据导入,此时可以借助DataWorks的强大调度和作业编排能力,实现周期性调度,配置一个调度作业覆盖数据导入两个场景,详情请参见DataWorks作业案例。
考虑到作业较为复杂,所以可以利用DataWorks的迁移助手功能,将Data作业案例文件导入您的项目中,您即可获得Data作业案例,之后按照您的具体业务需求更改部分参数或脚本即可,详情请参见使用迁移工具导入DataWorks作业。
注意事项
- 使用临时表的原因是为了保证原子性,只有在导入完成后才绑定至分区表,为了避免导入任务失败时还需要重新删除表等操作。
- 对于更新子表分区数据场景,需要删除子表和重新绑定临时表放入一个事务过程中,保证该过程的事务性。
- 使用迁移工具导入DataWorks作业时需满足以下条件:
- DataWorks需标准版及以上版本,详情请参见DataWorks各版本详解。
- DataWorks工作空间需绑定MaxCompute和Hologres计算引擎服务,详情请参见创建并管理工作空间。
详细操作步骤
- MaxCompute数据准备
- Hologres中建表
- 创建外部表
- 登录数据库
- 在HoloWeb控制台DB授权页面,单击元数据管理。
- 在元数据管理页面,双击左侧目录树中已创建成功的数据库名称,单击确认。
- 创建外部表
- 在SQL编辑器页面,单击左上角的新建SQL窗口。
- 在新增的临时Query查询页面,选择已创建的实例名和数据库后,请您在SQL查询的编辑框输入如下语句,单击运行。
DROP FOREIGN TABLE IF EXISTS odps_sale_detail; -- 创建外部表 IMPORT FOREIGN SCHEMA maxcompute_project LIMIT to ( odps_sale_detail ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'error',if_unsupported_type 'error');
- 登录数据库
- 创建分区表(内部表)
- 登录数据库
- 在HoloWeb控制台DB授权页面,单击元数据管理。
- 在元数据管理页面,双击左侧目录树中已创建成功的数据库名称,单击确认。
- 创建分区表
- 在SQL编辑器页面,单击左上角的新建SQL窗口。
- 在新增的临时Query查询页面,选择已创建的实例名和数据库后,请您在SQL查询的编辑框输入如下语句,单击运行。
DROP TABLE IF EXISTS holo_sale_detail; -- 创建Hologres分区表(内部表) BEGIN ; CREATE TABLE IF NOT EXISTS holo_sale_detail ( shop_name TEXT ,customer_id TEXT ,total_price FLOAT8 ,sale_date TEXT ) PARTITION BY LIST(sale_date); COMMIT;
- 登录数据库
- 创建外部表
- 分区数据导入Hologres临时表
在临时Query查询页面,请您在SQL查询的编辑框输入如下语句,单击运行。
此SQL语句将MaxCompute的hologres_test项目中的odps_sale_detail分区表的20210816分区导入Hologres中的holo_sale_detail分区表的20210816分区。
-- 刷新外表的Schema IMPORT FOREIGN SCHEMA hologres_test LIMIT to ( odps_sale_detail ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'update',if_unsupported_type 'error'); -- 清理潜在的临时表 BEGIN ; DROP TABLE IF EXISTS holo_sale_detail_tmp_20210816; COMMIT ; -- 创建临时表 SET hg_experimental_enable_create_table_like_properties=on; BEGIN ; CALL HG_CREATE_TABLE_LIKE ('holo_sale_detail_tmp_20210816', 'select * from holo_sale_detail'); COMMIT; -- 向临时表插入数据 INSERT INTO holo_sale_detail_tmp_20210816 SELECT * FROM public.odps_sale_detail WHERE sale_date='20210816';
- 临时表绑定至Hologres分区表
在临时Query查询页面,请您在SQL查询的编辑框输入如下语句,单击运行。
- 存在旧的子表,则需要先删除旧子表,再将临时表绑定至Hologres分区表。此SQL语句用于删除子表holo_sale_detail_20210816并将临时表holo_sale_detail_tmp_20210816绑定至holo_sale_detail分区表的20210816分区。
-- 已有子表时替换子表 BEGIN ; -- 删除旧子表 DROP TABLE IF EXISTS holo_sale_detail_20210816; -- 将临时表改名 ALTER TABLE holo_sale_detail_tmp_20210816 RENAME TO holo_sale_detail_20210816; -- 将临时表绑定至指定分区表 ALTER TABLE holo_sale_detail ATTACH PARTITION holo_sale_detail_20210816 FOR VALUES IN ('20210816') ; COMMIT ;
- 不存在旧子表,直接将临时表绑定至Hologres分区表。此SQL语句用于将临时表holo_sale_detail_tmp_20210816绑定至holo_sale_detail分区表的20210816分区。
BEGIN ; -- 将临时表改名 ALTER TABLE holo_sale_detail_tmp_20210816 RENAME TO holo_sale_detail_20210816; -- 将临时表绑定至指定分区表 ALTER TABLE holo_sale_detail ATTACH PARTITION holo_sale_detail_20210816 FOR VALUES IN ('20210816'); COMMIT ;
- 存在旧的子表,则需要先删除旧子表,再将临时表绑定至Hologres分区表。
- ANALYZE Hologres分区表
在临时Query查询页面,请您在SQL查询的编辑框输入如下语句,单击运行。
此SQL语句用于ANALYZE holo_sale_detail分区表,验证分区表执行计划。ANALYZE分区表时,仅需ANALYZE父表。
-- 大量数据导入后执行ANALYZE分区表父表操作 ANALYZE holo_sale_detail;
- 清理过期的分区子表(按需)生产环境中,数据具备生命周期,对于超期的分区需要清理。
在临时Query查询页面,请您在SQL查询的编辑框输入如下语句,单击运行。
此SQL语句清理20210631的分区。
DROP TABLE IF EXISTS holo_sale_detail_20210631;
DataWorks作业案例

业务流程模块详解
- 基础参数
基础参数用于管理整个业务流程中用到的所有参数,主要用到的参数如下。
编号 参数名 类型 取值 描述 1 datepre31 变量 ${yyyymmdd-31} 用于控制清理过期分区的参数,此处含义为清理31天前的分区。 2 datetime1 变量 $bizdate 用于控制创建分区的参数。 3 holo_table_name 常量 holo_sale_detail Hologres分区表名。 4 odps_project 常量 hologres_test MaxCompute项目名。 5 odps_table_name 常量 odps_sale_detail MaxCompute分区表名。 6 partition_key 常量 sale_date MaxCompute分区字段。 系统配置图如下。 - 写入分区数据至临时表
该步骤是一个Hologres SQL模块,其中SQL代码如下。
-- 刷新外表的Schema IMPORT FOREIGN SCHEMA ${odps_project} LIMIT to ( ${odps_table_name} ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'update',if_unsupported_type 'error'); -- 清理潜在的临时表 BEGIN ; DROP TABLE IF EXISTS ${holo_table_name}_tmp_${datetime1}; COMMIT ; -- 创建临时表 SET hg_experimental_enable_create_table_like_properties=on; BEGIN ; CALL HG_CREATE_TABLE_LIKE ('${holo_table_name}_tmp_${datetime1}', 'select * from ${holo_table_name}'); COMMIT; -- 向临时表插入数据 INSERT INTO ${holo_table_name}_tmp_${datetime1} SELECT * FROM public.${odps_table_name} WHERE ${partition_key}='${datetime1}';
需要将基础参数绑定至该模块上游,用于控制其中的参数变量,系统配置如下: - 替换子表
该步骤是一个Hologres SQL模块,用于替换已有子表。将替换子表相关过程放在一个事务中,保证执行的事务性,SQL代码如下。
-- 已有子表时替换子表 BEGIN ; -- 删除已经存在的子表 DROP TABLE IF EXISTS ${holo_table_name}_${datetime1}; -- 将临时表改名 ALTER TABLE ${holo_table_name}_tmp_${datetime1} RENAME TO ${holo_table_name}_${datetime1}; -- 将临时表绑定至指定分区表 ALTER TABLE ${holo_table_name} ATTACH PARTITION ${holo_table_name}_${datetime1} FOR VALUES IN ('${datetime1}'); COMMIT ;
需要将基础参数绑定至该模块上游,用于控制其中的参数变量,系统配置如下。 - 收集分区表的统计信息
该步骤是一个Hologres SQL模块,收集父表的统计信息,SQL代码如下。
-- 大量数据导入后执行ANALYZE分区表父表操作 ANALYZE ${holo_table_name};
需要将基础参数绑定至该模块上游,用于控制其中的参数变量,系统配置如下。 - 清理过期子表
生产环境中,数据具备生命周期,对于超期的分区需要清理。
现以仅在Hologres中存储最近31天的分区为例,由于之前设置的参数为datepre31=${yyyymmdd-31},所以清理过期子表的SQL代码如下。
-- 清理过期子表 BEGIN ; DROP TABLE IF EXISTS ${holo_table_name}_${datepre31}; COMMIT ;
所以在作业运行时,如果bizdate=20200309,则datepre31=20200207,这样即可达到清理分区的目的。
同时需要将基础参数绑定至该模块上游,用于控制其中的参数变量,系统配置如下。
使用迁移工具导入DataWorks作业
- 考虑到作业较为复杂,所以可以利用DataWorks的迁移助手功能,将以下文件导入您的项目中,您即可获得以上说明的DataWorks的作业,之后按照您的具体业务需求更改部分参数或脚本即可。
- DataWorks迁移助手的详细介绍,请参见DataWorks迁移助手介绍及实践。
- 下载如下作业包:DataWorks作业包。
- 进入DataWorks迁移助手,详情请参见进入迁移助手。
- 在迁移助手的左侧导航栏,单击 。
- 在DataWorks导入页面,单击右上方的新建导入任务。
- 在新建导入任务对话框中,配置各项参数。
- 单击确认,进入导入任务设置页面,设置匹配关系。
- 单击右上方的开始导入,在请确认对话框中,单击确认。
- 导入成功后,在您的数据开发模块中则会出现以上提及的周期性作业。
- 同时在手工作业流程中会出现相关的DDL语句。
- 导入成功后,在您的数据开发模块中则会出现以上提及的周期性作业。