HoloStudio与DataWorks无缝连通,您可以通过HoloStudio将MaxCompute数据导入Hologres,并基于DataWorks的底层能力,前往DataWorks进行定时调度,实现周期性导入数据至Hologres。本文为您介绍如何将MaxCompute源表数据导入Hologres进行周期性调度。
背景信息
MaxCompute与Hologres的分区无强映射关系,MaxCompute的分区字段映射为Hologres的普通字段。因此,您可以将MaxCompute的分区表或非分区表导入Hologres的分区或非分区表,可以根据实际业务情况选择是否需要分区。
前往DataWorks调度会产生一定的调度费用,详细收费情况,请参见DataWorks资源组概述。
如果需要实现写入更新,您需要使用INSERT ON CONFLICT(UPSERT)语法。
如果MaxCompute数据会定期更新,建议您在Hologres导入数据时,使用IMPORT FOREIGN SCHEMA语句来更新外部表,以便于及时获取MaxCompute的元数据。
外表名和内表名必须不一样,否则会报错。如使用import foreign语法创建外表,则外表名和MaxCompute表名必须保持一致。
操作步骤
准备MaxCompute表数据。
准备一张MaxCompute数据源表,您可以参考创建表进行建表并导入数据。示例选用MaxCompute公共数据集public_data的分区表dwd_ product_movie_basic_info表,您可以参照使用公开数据集描述,登录并查询数据集。其建表DDL语句如下:
--MaxCompute分区表DDL CREATE TABLE IF NOT EXISTS public_data.dwd_product_movie_basic_info( movie_name STRING COMMENT '电影名称', dirctor STRING COMMENT '导演', scriptwriter STRING COMMENT '编剧', area STRING COMMENT '制片地区/国家', actors STRING COMMENT '主演', `type` STRING COMMENT '类型', movie_length STRING COMMENT '电影长度', movie_date STRING COMMENT '上映日期', movie_language STRING COMMENT '语言', imdb_url STRING COMMENT 'imdb号' ) PARTITIONED BY (ds STRING) STORED AS ALIORC; --查看分区表的某个分区数据 SELECT * FROM public_data.dwd_product_movie_basic_info WHERE ds = '20170112';
查询数据显示如下图所示。
新建外部表。
进入HoloStudio,在SQL Console中新建一张外部表,用于映射MaxCompute源表数据。外部表的字段顺序和字段类型需要和MaxCompute一一对应。示例新建外部表的SQL语句如下:
BEGIN; CREATE FOREIGN TABLE public.dwd_product_movie_basic_info ( "movie_name" text, "dirctor" text, "scriptwriter" text, "area" text, "actors" text, "type" text, "movie_length" text, "movie_date" text, "movie_language" text, "imdb_url" text, "ds" text ) SERVER odps_server OPTIONS (project_name 'public_data', table_name 'dwd_product_movie_basic_info'); comment on column public.dwd_product_movie_basic_info."movie_name" is '电影名称'; comment on column public.dwd_product_movie_basic_info."dirctor" is '导演'; comment on column public.dwd_product_movie_basic_info."scriptwriter" is '编剧'; comment on column public.dwd_product_movie_basic_info."area" is '制片地区/国家'; comment on column public.dwd_product_movie_basic_info."actors" is '主演'; comment on column public.dwd_product_movie_basic_info."type" is '类型'; comment on column public.dwd_product_movie_basic_info."movie_length" is '电影长度'; comment on column public.dwd_product_movie_basic_info."movie_date" is '上映日期'; comment on column public.dwd_product_movie_basic_info."movie_language" is '语言'; comment on column public.dwd_product_movie_basic_info."imdb_url" is 'imdb号'; COMMIT;
OPTIONS的连接参数说明如下表所示。
参数
描述
project_name
MaxCompute的项目名称。
table_name
MaxCompute的表名称。
新建存储表。
在HoloStudio中新建一张用于接收并存储数据的真实存储表。由于本次示例是将MaxCompute分区表导入Hologres分区表,因此需要在Hologres中创建一张分区表。
该示例建表DDL仅是简单示例,实际建表DDL请根据实际业务需要创建,并给表设置合理的索引,以达到更优的查询性能,DDL示例如下:
BEGIN; CREATE TABLE "public"."holo_dwd_product_movie_basic_info" ( "movie_name" text, "dirctor" text, "scriptwriter" text, "area" text, "actors" text, "type" text, "movie_length" text, "movie_date" text, "movie_language" text, "imdb_url" text, "ds" text ) PARTITION BY LIST (ds); CALL SET_TABLE_PROPERTY('"public"."holo_dwd_product_movie_basic_info"', 'orientation', 'column'); CALL SET_TABLE_PROPERTY('"public"."holo_dwd_product_movie_basic_info"', 'bitmap_columns', '"movie_name","dirctor","scriptwriter","area","actors","type","movie_length","movie_date","movie_language","imdb_url","ds"'); CALL SET_TABLE_PROPERTY('"public"."holo_dwd_product_movie_basic_info"', 'dictionary_encoding_columns', '"movie_name:auto","dirctor:auto","scriptwriter:auto","area:auto","actors:auto","type:auto","movie_length:auto","movie_date:auto","movie_language:auto","imdb_url:auto","ds:auto"'); CALL SET_TABLE_PROPERTY('"public"."holo_dwd_product_movie_basic_info"', 'time_to_live_in_seconds', '3153600000'); comment on column "public"."holo_dwd_product_movie_basic_info"."movie_name" is '电影名称'; comment on column "public"."holo_dwd_product_movie_basic_info"."dirctor" is '导演'; comment on column "public"."holo_dwd_product_movie_basic_info"."scriptwriter" is '编剧'; comment on column "public"."holo_dwd_product_movie_basic_info"."area" is '制片地区/国家'; comment on column "public"."holo_dwd_product_movie_basic_info"."actors" is '主演'; comment on column "public"."holo_dwd_product_movie_basic_info"."type" is '类型'; comment on column "public"."holo_dwd_product_movie_basic_info"."movie_length" is '电影长度'; comment on column "public"."holo_dwd_product_movie_basic_info"."movie_date" is '上映日期'; comment on column "public"."holo_dwd_product_movie_basic_info"."movie_language" is '语言'; comment on column "public"."holo_dwd_product_movie_basic_info"."imdb_url" is 'imdb号'; COMMIT;
新建分区子表的数据开发。
由于本示例是将MaxCompute分区表数据导入Hologres分区表,因此需要在Hologres中创建对应的分区键值的分区子表。然后将分区数据导入对应的分区子表。这里通过{bizdate}参数控制分区键值,在调度系统中自动赋值完成周期性调度。关于参数的配置,请参见DataWorks文档DataWorks调度配置。其中,insert的分区数据必须和分区键(本文示例为ds)的值保持一致,否则会报错。
在HoloStudio中,单击左侧导航栏的图标,进入数据开发页面。
鼠标悬停至图标,单击Hologres开发。
配置新建节点对话框的节点名称、目标文件夹及数据库参数。
单击提交,成功创建Hologres开发节点。
在新建的Hologres开发节点的编辑界面,输入如下创建分区表的数据开发语句。
--创建分区子表 DROP TABLE IF EXISTS "public".holo_dwd_product_movie_basic_info_${bizdate}; CREATE TABLE IF NOT EXISTS "public".holo_dwd_product_movie_basic_info_${bizdate} PARTITION OF "public".holo_dwd_product_movie_basic_info FOR VALUES IN ('${bizdate}'); --更新外表数据 IMPORT FOREIGN SCHEMA public_data LIMIT TO (dwd_product_movie_basic_info) from server odps_server into hmads options(if_table_exist 'update'); --等待30s再导入Hologres,以防Hologres meta信息更新缓存慢导致的数据不一致而同步不成功 SELECT pg_sleep(30); --导入指定分区数据 INSERT INTO "public".holo_dwd_product_movie_basic_info_${bizdate} SELECT "movie_name", "dirctor", "scriptwriter", "area", "actors", "type", "movie_length", "movie_date", "movie_language", "imdb_url", "ds" FROM "hmads".foreign_dwd_product_movie_basic_info WHERE ds='${bizdate}';
单击顶部菜单栏左侧的,保存Hologres开发。
单击顶部菜单栏右侧的前往DataWorks调度,进入调度页面。
新建分区表的调度作业。
在DataWorks中新建Hologres节点。
单击前往DataWorks调度后,页面自动跳转至DataWorks的新建节点。您需要配置新建节点对话框的节点类型、节点名称及目标文件夹,创建Hologres节点。节点类型选择Hologres开发。
如果是重新执行已有作业,则可以不需要重新创建节点。
在新建的节点页面,单击更新节点版本,将分区表的信息同步至该节点。
配置调度信息。
在新建的节点页面,单击右侧导航栏的调度配置,配置调度参数。详情请参见调度参数支持的格式。本次示例选择的是日调度,因此将会每天自动生成一张分区子表,并导入对应的数据,以此来实现增量数据周期性调度。更多的调度逻辑(包括调度周期、调度参数、调度上下游等)请参见DataWorks调度配置。
具体配置如下所示:
发布调度。
配置完调度参数,在新建节点页面的顶部菜单栏左侧,单击图标,保存调度配置。
在新建节点页面的顶部菜单栏左侧,单击图标,提交调度信息。
发布包提交成功后,单击任务发布页面顶部菜单栏右侧的运维中心,进入运维中心。
在左侧导航栏,单击 ,勾选并单击目标任务名称。
在右侧编辑界面,鼠标右键单击目标任务节点,选择 。
根据业务实际情况,配置补数据对话框的各项参数。完成调度任务的发布。
任务执行成功后,您可以通过如下方式查询数据。
您可以返回Hologres中,通过标准SQL查看父表或分区表的数据,示例如下。
--查看分区子表数据 SELECT * FROM holo_dwd_product_movie_basic_info_20170112; --查看分区父表总数据 SELECT COUNT(*) FROM holo_dwd_product_movie_basic_info;
返回HoloStudio。单击新建节点的图标,刷新当前页面。您可以在PG管理模块找到目标分区表,查看调度成功的分区表数据。双击目标表名称,在表编辑页面单击数据预览,即可看到已成功导入的数据。