Hologres支持通過創建外部表來加速MaxCompute數據的查詢,此方法允許您直接在Hologres環境中訪問和分析存儲在MaxCompute中的數據,從而提高查詢效率并簡化數據處理流程。
前提條件
已開通Hologres實例,詳情請參見購買Hologres。
已開通MaxCompute并創建項目,詳情請參見開通MaxCompute。
已為用戶授予訪問MaxCompute項目和表的權限,詳情請參見通過命令管理用戶權限。
注意事項
通過創建外部表加速查詢MaxCompute數據時,您需要注意如下內容:
由于跨地域查詢存在較多網絡不可靠因素,查詢穩定性無法保障,請確保Hologres和MaxCompute處于同一地域。
Hologres只能加速查詢MaxCompute的內部表,不能查詢MaxCompute的外部表和VIEW。
MaxCompute的分區與Hologres無強映射關系,映射至Hologres之后均為普通字段,但可通過分區條件過濾查詢。
通過外部表方式加速查詢MaxCompute數據,一次Query命中的數據量大小不超過200 GB,一次Query命中的分區數不超過512個。通過導入數據至Hologres內部表的方式則沒有此限制。
暫不支持讀取MaxCompute中Map、Struct類型的數據。
暫不支持讀取MaxCompute側使用DATETIME、TIMESTAMP、DECIMAL類型作為Cluster列的Range Cluster表數據。
僅支持讀取MaxCompute標準存儲數據,不支持讀取低頻存儲和長期存儲數據。
數據類型映射
MaxCompute與Hologres數據類型一一映射,建表時您可以查看映射關系,詳情請參見MaxCompute與Hologres的數據類型映射。
使用說明
您可通過以下方式實現MaxCompute數據的加速查詢:
方案一:通過CREATE FOREIGN TABLE加速查詢MaxCompute數據:適用于需要加速的外部表數量較少或僅需加速部分列,且MaxCompute源表結構變更不頻繁的場景。
方案二:通過IMPORT FOREIGN SCHEMA加速查詢MaxCompute數據:適用于需要將外部數據源中的DB或者Schema級別的表全量映射至Hologres的Schema級別的場景。
方案三:通過Auto Load加速查詢MaxCompute數據:適用于需要加速的外部表數量較多或外部表結構變更比較頻繁的場景,您可根據需要選擇按需自動加載或全量自動加載。
方案一:通過CREATE FOREIGN TABLE
加速查詢MaxCompute數據
支持使用CREATE FOREIGN TABLE
方式靈活創建MaxCompute外部表(可自定義表名稱、自由選擇列、自定義comments信息等),此處以CREATE FOREIGN TABLE
方式為例為您介紹通過Hologres查詢MaxCompute非分區表和分區表數據的操作步驟。
您也可以使用HoloWeb可視化建表,詳情請參見創建Hologres外部表(映射到MaxCompute)。
示例一:查詢MaxCompute非分區表數據
準備MaxCompute非分區表數據。
在MaxCompute中創建一張非分區表并導入數據。示例數據選用MaxCompute公開數據集
BIGDATA_PUBLIC_DATASET.tpcds_10t
下的customer
表,其表DDL及部分數據如下:--MaxCompute公共數據集的表DDL CREATE TABLE IF NOT EXISTS public_data.customer( c_customer_sk BIGINT, c_customer_id STRING, c_current_cdemo_sk BIGINT, c_current_hdemo_sk BIGINT, c_current_addr_sk BIGINT, c_first_shipto_date_sk BIGINT, c_first_sales_date_sk BIGINT, c_salutation STRING, c_first_name STRING, c_last_name STRING, c_preferred_cust_flag STRING, c_birth_day BIGINT, c_birth_month BIGINT, c_birth_year BIGINT, c_birth_country STRING, c_login STRING, c_email_address STRING, c_last_review_date_sk STRING); --在MaxCompute中查詢表是否有數據 SELECT * FROM BIGDATA_PUBLIC_DATASET.tpcds_10t.customer;
部分數據如下:
在Hologres中創建外部表。
在Hologres中創建一張用于映射MaxCompute數據的外部表。示例語句如下。
SET hg_enable_convert_type_for_foreign_table = true; CREATE FOREIGN TABLE customer ( "c_customer_sk" int8, "c_customer_id" text, "c_current_cdemo_sk" int8, "c_current_hdemo_sk" int8, "c_current_addr_sk" int8, "c_first_shipto_date_sk" int8, "c_first_sales_date_sk" int8, "c_salutation" text, "c_first_name" text, "c_last_name" text, "c_preferred_cust_flag" text, "c_birth_day" int8, "c_birth_month" int8, "c_birth_year" int8, "c_birth_country" text, "c_login" text, "c_email_address" text, "c_last_review_date_sk" text) SERVER odps_server OPTIONS (project_name 'BIGDATA_PUBLIC_DATASET.tpcds_10t', table_name 'customer');
參數說明如下表所示。
參數
描述
SERVER
外部表服務器。
您可以直接調用Hologres底層已創建的名為odps_server的外部表服務器。詳細原理請參見Postgres FDW。
project_name
如果您MaxCompute的Project是三層模型模式:project_name為MaxCompute的項目名稱和Schema名稱,格式為
odps_project_name#odps_schema_name
。
如果您MaxCompute的Project是兩層模型模式:project_name為MaxCompute的項目名稱。
三層模型詳情請參見Schema操作。
table_name
需要查詢的MaxCompute表名稱。
通過Hologres加速查詢MaxCompute表數據。
外部表創建成功后,直接在Hologres中查詢外部表,即可查詢到MaxCompute的數據。示例語句如下。
SELECT * FROM customer LIMIT 10;
示例2:查詢MaxCompute分區表數據
準備MaxCompute分區表數據
在MaxCompute中準備一張分區表并導入數據,示例數據選用MaxCompute公開數據集
BIGDATA_PUBLIC_DATASET.finance
下的ods_enterprise_share_trade_h
表,其DDL及部分數據如下:--公共數據集下表的DDL CREATE TABLE IF NOT EXISTS public_data.ods_enterprise_share_trade_h( code STRING COMMENT '代碼', name STRING COMMENT '名稱', industry STRING COMMENT '所屬行業', area STRING COMMENT '地區', pe STRING COMMENT '市盈率', outstanding STRING COMMENT '流通股本', totals STRING COMMENT '總股本(萬)', totalassets STRING COMMENT '總資產(萬)', liquidassets STRING COMMENT '流動資產', fixedassets STRING COMMENT '固定資產', reserved STRING COMMENT '公積金', reservedpershare STRING COMMENT '每股公積金', eps STRING COMMENT '每股收益', bvps STRING COMMENT '每股凈資', pb STRING COMMENT '市凈率', timetomarket STRING COMMENT '上市日期', undp STRING COMMENT '未分利潤', perundp STRING COMMENT '每股未分配', rev STRING COMMENT '收入同比(%)', profit STRING COMMENT '利潤同比(%)', gpr STRING COMMENT '毛利率(%)', npr STRING COMMENT '凈利潤率(%)', holders_num STRING COMMENT '股東人數') PARTITIONED BY (ds STRING) STORED AS ALIORC TBLPROPERTIES ('comment'='數據導入日期'); --在MaxCompute中查詢某個分區的數據 SELECT * FROM BIGDATA_PUBLIC_DATASET.finance.ods_enterprise_share_trade_h WHERE ds = '20170113';
部分數據如下:
在Hologres中創建外部表。
在Hologres中創建一張用于映射MaxCompute數據的外部表。示例語句如下。
CREATE FOREIGN TABLE public.foreign_ods_enterprise_share_trade_h ( "code" text, "name" text, "industry" text, "area" text, "pe" text, "outstanding" text, "totals" text, "totalassets" text, "liquidassets" text, "fixedassets" text, "reserved" text, "reservedpershare" text, "eps" text, "bvps" text, "pb" text, "timetomarket" text, "undp" text, "perundp" text, "rev" text, "profit" text, "gpr" text, "npr" text, "holders_num" text, "ds" text ) SERVER odps_server OPTIONS (project_name 'BIGDATA_PUBLIC_DATASET#finance', table_name 'ods_enterprise_share_trade_h'); comment on foreign table public.foreign_ods_enterprise_share_trade_h is '股票歷史交易信息'; comment on column public.foreign_ods_enterprise_share_trade_h."code" is '代碼'; comment on column public.foreign_ods_enterprise_share_trade_h."name" is '名稱'; comment on column public.foreign_ods_enterprise_share_trade_h."industry" is '所屬行業'; comment on column public.foreign_ods_enterprise_share_trade_h."area" is '地區'; comment on column public.foreign_ods_enterprise_share_trade_h."pe" is '市盈率'; comment on column public.foreign_ods_enterprise_share_trade_h."outstanding" is '流通股本'; comment on column public.foreign_ods_enterprise_share_trade_h."totals" is '總股本(萬)'; comment on column public.foreign_ods_enterprise_share_trade_h."totalassets" is '總資產(萬)'; comment on column public.foreign_ods_enterprise_share_trade_h."liquidassets" is '流動資產'; comment on column public.foreign_ods_enterprise_share_trade_h."fixedassets" is '固定資產'; comment on column public.foreign_ods_enterprise_share_trade_h."reserved" is '公積金'; comment on column public.foreign_ods_enterprise_share_trade_h."reservedpershare" is '每股公積金'; comment on column public.foreign_ods_enterprise_share_trade_h."eps" is '每股收益'; comment on column public.foreign_ods_enterprise_share_trade_h."bvps" is '每股凈資'; comment on column public.foreign_ods_enterprise_share_trade_h."pb" is '市凈率'; comment on column public.foreign_ods_enterprise_share_trade_h."timetomarket" is '上市日期'; comment on column public.foreign_ods_enterprise_share_trade_h."undp" is '未分利潤'; comment on column public.foreign_ods_enterprise_share_trade_h."perundp" is '每股未分配'; comment on column public.foreign_ods_enterprise_share_trade_h."rev" is '收入同比(%)'; comment on column public.foreign_ods_enterprise_share_trade_h."profit" is '利潤同比(%)'; comment on column public.foreign_ods_enterprise_share_trade_h."gpr" is '毛利率(%)'; comment on column public.foreign_ods_enterprise_share_trade_h."npr" is '凈利潤率(%)'; comment on column public.foreign_ods_enterprise_share_trade_h."holders_num" is '股東人數';
通過Hologres查詢MaxCompute分區表數據。
查詢前10條數據,SQL語句如下:
SELECT * FROM foreign_ods_enterprise_share_trade_h limit 10;
查詢分區數據,示例SQL如下:
SELECT * FROM foreign_ods_enterprise_share_trade_h WHERE ds = '20170113';
方案二:通過IMPORT FOREIGN SCHEMA
加速查詢MaxCompute數據
若您需要批量創建MaxCompute外部表,可通過IMPORT FOREIGN SCHEMA
方式。更多詳情介紹,請參見IMPORT FOREIGN SCHEMA
方案三:通過Auto Load加速查詢MaxCompute數據
當實例中需要加速的外部表較多或外部表結構變更比較頻繁(如在MaxCompute側執行過刪除列、修改列順序、修改列類型等操作的表)時,您可以直接使用外部表自動加載(Auto Load)功能實現MaxCompute數據的按需自動加載以及全量自動加載,而無需手動改變外部表的結構,從而提高查詢效率。詳情請參見外部表自動加載。