通過SQL導(dǎo)出數(shù)據(jù)至MaxCompute
本文將為您介紹如何在Hologres中通過SQL方式將數(shù)據(jù)導(dǎo)出至MaxCompute。
前提條件
開通MaxCompute并連接開發(fā)工具,請參見通過查詢編輯器使用MaxCompute。
開通Hologres并連接開發(fā)工具,請參見連接HoloWeb并執(zhí)行查詢。
使用限制
僅Hologres V0.9及以上版本支持使用SQL導(dǎo)出數(shù)據(jù)至MaxCompute,如果您的實例是V0.9以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
Hologres的數(shù)據(jù)類型與MaxCompute的數(shù)據(jù)類型逐一對應(yīng),但Hologres當前不支持DATE、ARRAY、MAP、STRUCT等復(fù)雜數(shù)據(jù)類型,從Hologres V1.3版本開始,支持將ARRAY和DATE類型回寫至MaxCompute。其余數(shù)據(jù)類型映射請參見數(shù)據(jù)類型匯總。
Hologres從V1.1版本開始,默認支持導(dǎo)出至MaxCompute,如果您的Hologres實例版本低于V1.1,請在
insert
語句前添加以下語句。--V0.9和V0.10版本需要使用以下參數(shù) set hg_experimental_enable_write_maxcompute = on;
暫不支持使用SQL將數(shù)據(jù)導(dǎo)出至MaxCompute的Transactional表。
注意事項
在Hologres中使用SQL導(dǎo)出數(shù)據(jù)至MaxCompute需要注意如下事項:
支持跨區(qū)域?qū)С鲋罬axCompute,但因為網(wǎng)絡(luò)原因,同一個區(qū)域?qū)С龅男阅軙谩?/p>
當前Hologres僅支持一級分區(qū),但是可以導(dǎo)出至MaxCompute的二級分區(qū),但是需要MaxCompute的分區(qū)值與Hologres字段逐一對應(yīng)。同時Hologres的分區(qū)表也可以導(dǎo)入至MaxCompute的非分區(qū)表。
MaxCompute寫入服務(wù)器數(shù)量有限,建議您避開凌晨生產(chǎn)作業(yè)高峰期,以獲得更佳性能。
如果存在TIMESTAMPTZ類型的字段,字段的取值范圍為1677-09-21 00:00:00到2262-04-12 00:00:00。
操作流程
在Hologres準備一張Hologres內(nèi)部表(例如:holo_source),用于導(dǎo)出數(shù)據(jù)至MaxCompute。
在MaxCompute準備一張MaxCompute表用于接收數(shù)據(jù)(例如mc_sink)。
在Hologres新建一張外部表,用于映射MaxCompute表(例如 mapping_foreign_table)。
在Hologres通過SQL語句導(dǎo)出數(shù)據(jù)至MaxCompute。
說明Hologres從V2.1.17版本起支持Serverless Computing能力,針對大數(shù)據(jù)量離線導(dǎo)入、大型ETL作業(yè)、外表大數(shù)據(jù)量查詢等場景,使用Serverless Computing執(zhí)行該類任務(wù)可以直接使用額外的Serverless資源,避免使用實例自身資源,無需為實例預(yù)留額外的計算資源,顯著提升實例穩(wěn)定性、減少OOM概率,且僅需為任務(wù)單獨付費。Serverless Computing詳情請參見Serverless Computing概述,Serverless Computing使用方法請參見Serverless Computing使用指南。
-- (可選)推薦使用Serverless Computing執(zhí)行大數(shù)據(jù)量離線導(dǎo)入和ETL作業(yè) SET hg_computing_resource = 'serverless'; --導(dǎo)出部分字段 INSERT INTO mapping_foreign_table SELECT x,x,x FROM holo_soruce;--x,x,x可以替換為您需要導(dǎo)出的字段名 --導(dǎo)出全部字段 INSERT INTO mapping_foreign_table SELECT * FROM holo_soruce; -- 重置配置,保證非必要的SQL不會使用serverless資源。 RESET hg_computing_resource;
下面將會分非分區(qū)表和分區(qū)表兩種情況來說明具體操作。
非分區(qū)表導(dǎo)出至MaxCompute非分區(qū)表
準備Hologres數(shù)據(jù)源表。
在Hologres中準備一張數(shù)據(jù)表,用于將數(shù)據(jù)導(dǎo)出至MaxCompute。示例選擇已有表其DDL如下:
BEGIN; CREATE TABLE "public"."bank" ( "age" int8, "job" text, "marital" text, "education" text, "card" text, "housing" text, "loan" text, "contact" text, "month" text, "day_of_week" text, "duration" text, "campaign" int8, "pdays" float8, "previous" float8, "poutcome" text, "emp_var_rate" float8, "cons_price_idx" float8, "cons_conf_idx" float8, "euribor3m" float8, "nr_employed" float8, "y" int8 ); COMMIT;
創(chuàng)建MaxCompute目標表。
在MaxCompute中創(chuàng)建一張目標表,用于接收數(shù)據(jù),字段順序與字段類型需要與Hologres表逐一對應(yīng)。其建表語法,請參見表操作。
CREATE TABLE IF NOT EXISTS mc_bank ( age BIGINT COMMENT '年齡', job STRING COMMENT '工作類型', marital STRING COMMENT '婚否', education STRING COMMENT '教育程度', card STRING COMMENT '是否有信用卡', housing STRING COMMENT '房貸', loan STRING COMMENT '貸款', contact STRING COMMENT '聯(lián)系途徑', month STRING COMMENT '月份', day_of_week STRING COMMENT '星期幾', duration STRING COMMENT '持續(xù)時間', campaign BIGINT COMMENT '本次活動聯(lián)系的次數(shù)', pdays DOUBLE COMMENT '與上一次聯(lián)系的時間間隔', previous DOUBLE COMMENT '之前與客戶聯(lián)系的次數(shù)', poutcome STRING COMMENT '之前市場活動的結(jié)果', emp_var_rate DOUBLE COMMENT '就業(yè)變化速率', cons_price_idx DOUBLE COMMENT '消費者物價指數(shù)', cons_conf_idx DOUBLE COMMENT '消費者信心指數(shù)', euribor3m DOUBLE COMMENT '歐元存款利率', nr_employed DOUBLE COMMENT '職工人數(shù)', y BIGINT COMMENT '是否有定期存款' );
準備一張映射到MaxCompute的Hologres外部表。
在Hologres中準備一張外表,用于將字段映射至MaxCompute,也可以通過Import Foreign Table導(dǎo)入MaxCompute外表。創(chuàng)建外表示例DDL如下:
BEGIN; CREATE FOREIGN TABLE "public"."mapping_bank" ( "age" int8, "job" text, "marital" text, "education" text, "card" text, "housing" text, "loan" text, "contact" text, "month" text, "day_of_week" text, "duration" text, "campaign" int8, "pdays" float8, "previous" float8, "poutcome" text, "emp_var_rate" float8, "cons_price_idx" float8, "cons_conf_idx" float8, "euribor3m" float8, "nr_employed" float8, "y" int8 ) SERVER odps_server OPTIONS (project_name 'xxx',table_name 'mc_bank');--project_name為MaxCompute的project名,table_name為MaxCompute接收數(shù)據(jù)的表名 COMMIT;
參數(shù)說明如下。
參數(shù)
說明
project_name
MaxCompute的Project名稱
table_name
MaxCompute接收數(shù)據(jù)的表名稱。
導(dǎo)出Hologres數(shù)據(jù)至MaxCompute。
在Hologres中執(zhí)行SQL語句將數(shù)據(jù)導(dǎo)出至MaxCompute,您可以選擇導(dǎo)出部分字段,也可以選擇導(dǎo)出全部字段,導(dǎo)出部分字段時需要保證字段順序一致。
-- (可選)推薦使用Serverless Computing執(zhí)行大數(shù)據(jù)量離線導(dǎo)入和ETL作業(yè) SET hg_computing_resource = 'serverless'; --導(dǎo)出部分字段數(shù)據(jù) INSERT INTO mapping_bank SELECT age,job FROM bank; --導(dǎo)出全部字段數(shù)據(jù) INSERT INTO mapping_bank SELECT * FROM bank; -- 重置配置,保證非必要的SQL不會使用serverless資源。 RESET hg_computing_resource;
分區(qū)表導(dǎo)出至MaxCompute分區(qū)表
準備Hologres數(shù)據(jù)源表。
在Hologres中準備一張分區(qū)源表,用于將數(shù)據(jù)導(dǎo)出至MaxCompute。示例選擇已有表其DDL如下:
BEGIN; CREATE TABLE "public"."par_bank" ( "age" int8, "job" text, "marital" text, "education" text, "default" text, "housing" text, "loan" text, "contact" text, "month" text, "day_of_week" text, "duration" text, "campaign" int8, "pdays" float8, "previous" float8, "poutcome" text, "emp_var_rate" float8, "cons_price_idx" float8, "cons_conf_idx" float8, "euribor3m" float8, "nr_employed" float8, "y" int8, "ds" text ) PARTITION BY list (ds); COMMIT; --需要有分區(qū)子表 CREATE TABLE "public"."par_bank_20190830" PARTITION OF "public"."par_bank" FOR VALUES IN ('20190830'); CREATE TABLE "public"."par_bank_20190901" PARTITION OF "public"."par_bank" FOR VALUES IN ('20190901');
創(chuàng)建MaxCompute目標表。
在MaxCompute中創(chuàng)建一張目標表,用于接收數(shù)據(jù),表可以是一級分區(qū),也可以是二級分區(qū)。字段順序與字段類型需要與Hologres表逐一對應(yīng)。其建表語法,請參見表操作。
--情況1:MaxCompute表是一級分區(qū) CREATE TABLE IF NOT EXISTS mc_par_bank ( age BIGINT COMMENT '年齡', job STRING COMMENT '工作類型', marital STRING COMMENT '婚否', education STRING COMMENT '教育程度', default STRING COMMENT '是否有信用卡', housing STRING COMMENT '房貸', loan STRING COMMENT '貸款', contact STRING COMMENT '聯(lián)系途徑', month STRING COMMENT '月份', day_of_week STRING COMMENT '星期幾', duration STRING COMMENT '持續(xù)時間', campaign BIGINT COMMENT '本次活動聯(lián)系的次數(shù)', pdays DOUBLE COMMENT '與上一次聯(lián)系的時間間隔', previous DOUBLE COMMENT '之前與客戶聯(lián)系的次數(shù)', poutcome STRING COMMENT '之前市場活動的結(jié)果', emp_var_rate DOUBLE COMMENT '就業(yè)變化速率', cons_price_idx DOUBLE COMMENT '消費者物價指數(shù)', cons_conf_idx DOUBLE COMMENT '消費者信心指數(shù)', euribor3m DOUBLE COMMENT '歐元存款利率', nr_employed DOUBLE COMMENT '職工人數(shù)', y BIGINT COMMENT '是否有定期存款' ) PARTITIONED BY ( ds STRING ); --為一級分區(qū)添加分區(qū) alter table mc_par_bank add if not exists partition (ds='20190830'); alter table mc_par_bank add if not exists partition (ds='20190901'); --情況二:MaxCompute表是二級分區(qū) CREATE TABLE IF NOT EXISTS mc_par_bank_2 ( age BIGINT COMMENT '年齡', job STRING COMMENT '工作類型', marital STRING COMMENT '婚否', education STRING COMMENT '教育程度', default STRING COMMENT '是否有信用卡', housing STRING COMMENT '房貸', loan STRING COMMENT '貸款', contact STRING COMMENT '聯(lián)系途徑', month STRING COMMENT '月份', day_of_week STRING COMMENT '星期幾', duration STRING COMMENT '持續(xù)時間', campaign BIGINT COMMENT '本次活動聯(lián)系的次數(shù)', pdays DOUBLE COMMENT '與上一次聯(lián)系的時間間隔', previous DOUBLE COMMENT '之前與客戶聯(lián)系的次數(shù)', poutcome STRING COMMENT '之前市場活動的結(jié)果', emp_var_rate DOUBLE COMMENT '就業(yè)變化速率', cons_price_idx DOUBLE COMMENT '消費者物價指數(shù)', cons_conf_idx DOUBLE COMMENT '消費者信心指數(shù)', euribor3m DOUBLE COMMENT '歐元存款利率', nr_employed DOUBLE COMMENT '職工人數(shù)' ) PARTITIONED BY ( y BIGINT, ds STRING ); alter table mc_par_bank_2 add if not exists partition (y='1',ds='20190830'); alter table mc_par_bank_2 add if not exists partition (y='1',ds='20190901');
準備一張映射到MaxCompute的Hologres外部表。
在Hologres中準備一張外表,用于將字段映射至MaxCompute。創(chuàng)建外表示例DDL如下:
--映射MaxCompute的一級分區(qū)表 BEGIN; CREATE FOREIGN TABLE "public"."mapping_par_bank" ( "age" int8, "job" text, "marital" text, "education" text, "default" text, "housing" text, "loan" text, "contact" text, "month" text, "day_of_week" text, "duration" text, "campaign" int8, "pdays" float8, "previous" float8, "poutcome" text, "emp_var_rate" float8, "cons_price_idx" float8, "cons_conf_idx" float8, "euribor3m" float8, "nr_employed" float8, "y" int8, "ds" text ) SERVER odps_server OPTIONS (project_name 'xxx',table_name 'mc_par_bank'); COMMIT; --映射MaxCompute的二級分區(qū)表 BEGIN; CREATE FOREIGN TABLE "public"."mapping_par_bank_2" ( "age" int8, "job" text, "marital" text, "education" text, "default" text, "housing" text, "loan" text, "contact" text, "month" text, "day_of_week" text, "duration" text, "campaign" int8, "pdays" float8, "previous" float8, "poutcome" text, "emp_var_rate" float8, "cons_price_idx" float8, "cons_conf_idx" float8, "euribor3m" float8, "nr_employed" float8, "y" int8, "ds" text ) SERVER odps_server OPTIONS (project_name 'xxx',table_name 'mc_par_bank_2');//project_name為MaxCompute的project名,table_name為MaxCompute接收數(shù)據(jù)的表名 COMMIT;
參數(shù)說明如下。
參數(shù)
說明
project_name
MaxCompute的Project名稱
table_name
MaxCompute接收數(shù)據(jù)的表名稱。
導(dǎo)出Hologres數(shù)據(jù)至MaxCompute。
在Hologres中執(zhí)行SQL語句將數(shù)據(jù)導(dǎo)出至MaxCompute,您可以選擇導(dǎo)出部分字段,也可以選擇導(dǎo)出全部字段,導(dǎo)出部分字段時需要保證字段順序一致。
-- (可選)推薦使用Serverless Computing執(zhí)行大數(shù)據(jù)量離線導(dǎo)入和ETL作業(yè) SET hg_computing_resource = 'serverless'; --導(dǎo)出至MaxCompute一級分區(qū)表 --示例1:加where條件的分區(qū)父表 INSERT INTO mapping_par_bank SELECT * FROM "public"."par_bank" WHERE ds='20190830'; --示例2:直接通過分區(qū)子表導(dǎo)出 insert into mapping_par_bank select * from "public"."par_bank_20190901"; --導(dǎo)出至MaxCompute二級分區(qū)表 --示例1:加where條件的分區(qū)父表 INSERT INTO mapping_par_bank_2 SELECT * FROM "public"."par_bank" WHERE y='1' and ds='20190830'; --示例2:直接通過Hologres分區(qū)子表導(dǎo)出 INSERT INTO mapping_par_bank_2 SELECT * FROM "public"."par_bank_20190901" where y='1'; -- 重置配置,保證非必要的SQL不會使用serverless資源。 RESET hg_computing_resource;
常見問題
問題現(xiàn)象
在數(shù)據(jù)導(dǎo)出至MaxCompute時報錯:
internal error: odps_writer_xxx,UploadId: xxx, Block 0 close odps writer failed: RequestId=xxx, ErrorCode=FlowExceeded, ErrorMessage= GlobalSlot Quota
。可能原因
Hologres通過SQL導(dǎo)出數(shù)據(jù)至MaxCompute時,為了實現(xiàn)高性能導(dǎo)出速度,接口使用MaxCompute Tunnel SDK服務(wù),詳情請參見Tunnel命令。但Tunnel接口在使用時,具有一定的并發(fā)和數(shù)據(jù)量限制,詳情請參見使用限制。當Tunnel接口處于流量高峰期時,回寫任務(wù)會受到一定的寫入限制,從而出現(xiàn)報錯。
解決方法
重試數(shù)據(jù)導(dǎo)出任務(wù)。
重試后仍然報錯,使用如下命令控制回寫速率。
--控制寫入MC的并發(fā)度,建議設(shè)置為[0~shard數(shù)]之間 set hg_experimental_write_maxcompute_dop =<count>;