從Hologres V0.10版本開始,Hologres與MaxCompute集成性進一步提升,支持在Hologres中執行MaxCompute的SQL語句,方便您直接快速操作MaxCompute。本文將為您介紹,在Hologres中如何執行MaxCompute SQL語句。
前提條件
已開通Hologres并連接開發工具,本文使用HoloWeb,詳情請參見連接HoloWeb。
已開通MaxCompute,詳情請參見通過查詢編輯器使用MaxCompute。
在Hologres中執行MaxCompute SQL需要當前用戶具有在MaxCompute中執行SQL的權限。關于MaxCompute的權限,詳情請參見用戶規劃與管理。
使用限制
僅Hologres V0.10 及以上版本支持在Hologres中執行MaxCompute SQL語句。請前往Hologres管控臺的實例詳情頁查看當前實例版本,如果您的實例是V0.10以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
目前建議您在Hologres中僅執行MaxCompute的DDL語句,如果需要執行DML語句,請前往MaxCompute進行操作。
每次調用只能執行一條SQL語句。
命令語法
語法示例
select exec_external_sql( 'server', 'database', 'sql' , timeout_ms, 'options' );
如上參數必須要按照順序填寫,若是需要省略某些參數,需要顯示指定參數名,如下所示:
exec_external_sql( server:='odps_server' , database:='odps_project_name' , sql:='sql' , timeout_ms:=timeout_ms , options:='options' )
參數說明
參數名
參數含義
說明
示例
server
外部服務器名稱。您可以直接調用Hologres底層已創建的名為odps_server的外部表服務器。此函數目前僅支持odps server,外部server詳細原理請參見Postgres FDW。
如果為空字符串,會取odps_server作為外部server。
'odps_server'
database
MaxCompute的project名。
無
'seahawks'
sql
需要執行的MaxCompute SQL(建議只執行DDL語句):
create table
alter table
desc table
drop table
SQL語句需要符合MaxCompute的語法,建議只執行DDL語句。如果SQL中有單引號,需要在SQL語句前后添加雙美元符號(
$$SQL$$
)實現單引號轉義。說明在HoloWeb和DataStudio的臨時查詢頁面暫不支持轉義字符。
'CREATE TABLE IF EXISTS MC_TBL ;'
timeout_ms
執行超時時間,單位ms。
缺省或者小于0的情況下會將該參數值設置為60000ms。超過超時時間將會退出,同時向MaxCompute發送一個取消指令。
50000
options
使用DataWorks或者MaxCompute客戶端提交SQL時,通常需要設置的SQL Flag。
具體的配置項請參見SET操作,若是有多個flag需要設置,需要將字段類型改成JSON格式。
{"odps.sql.type.system.odps2":"true"}
或者{ "odps.sql.type.system.odps2":"true", "odps.sql.decimal.odps2=":"true"}
使用示例
您可以在Hologres中執行MaxCompute SQL,如果執行建表語句則會在MaxCompute對應的project中創建一張表。當前版本建議僅執行DDL語句。
示例一:創建MaxCompute非分區表
select exec_external_sql( 'odps_server', 'mc_project' , --project名 'create table par_mc_table(id int,name string);' ,--在MaxCompute中創建一張表 5000 --超時時間為5000ms );
示例二:創建MaxCompute分區表并指定分區
--創建分區表 select exec_external_sql( server:='odps_server', database:='mc_project', --maxcompute的project名 sql:='create table par_mc_table(id int,name string) partitioned by (pt string);', --創建分區表 timeout_ms:=10000--超時時間為10000ms ); --指定分區表的分區 select exec_external_sql( 'odps_server', 'mc_project', --maxcompute的project名 $$ALTER TABLE par_mc_table ADD IF NOT EXISTS partition(pt='202102');$$--指定分區 );
示例三:跨Region創建MaxCompute表
select exec_external_sql( 'hangzhou_odps_server' , 'hologres_test' , 'create table mc_test(id int,create_time datetime,decimal_column decimal(38, 10));' , 50000, --超時時間 '{ "odps.sql.type.system.odps2":"true", "odps.sql.decimal.odps2":"true" }' --MaxCompute的flag設置,分別代表開啟新數據類型和開啟decimal類型 );
示例四:刪除MaxCompute中的表
select exec_external_sql( 'odps_server', 'mc_project', --MaxCompute的project名 'drop table if exists mc_table;' ,--刪除MaxCompute的表 50000 );
示例五:配合“通過SQL方式導出MaxCompute”功能使用
從Hologres V0.9版本開始,Hologres支持通過SQL導出數據至MaxCompute,但是該方法需要在MaxCompute中提前創建接收數據的表,操作比較麻煩。從Hologres V0.10版本開始,通過在Hologres中執行MaxCompute SQL,即可創建表,再將數據導出,支持一站式開發。
示例操作將Hologres中非分區數據導入至MaxCompute非分區表。具體如下:
在Hologres準備一張Hologres內部表(例如:holo_table),用于導出數據至MaxCompute,示例DDL和數據如下:
create table "public"."holo_table" ( "id" int4, "name" text ); insert into "public"."holo_table" values (1,'a'), (2,'b'), (3,'c');
創建一張MaxCompute表,用于在MaxCompute中接收數據。
select exec_external_sql( 'odps_server', 'mc_project' , --project名 'create table mc_sink_table(id int,name string);' ,--在MaxCompute中創建一張接收數據表 5000--超時時間為5000ms );
在Hologres新建一張外部表,用于映射MaxCompute表。
begin; create foreign table "public"."mc_mapping_foreign_table" ( "id" int4, "name" text ) server odps_server_bj options (project_name 'default_project_2361b62', table_name 'mc_sink_table'); commit;
在Hologres通過SQL語句導出數據至MaxCompute。
全部字段數據導出
set hg_experimental_enable_write_maxcompute = on;-- 由于是beta功能,需要打開GUC參數 insert into mc_mapping_foreign_table select * from holo_table;
部分字段數據導出
set hg_experimental_enable_write_maxcompute = on;-- 由于是beta功能,需要打開GUC參數 insert into mc_mapping_foreign_table (name) select name from holo_table;
更多關于數據導出的操作說明請參見通過SQL導出數據至MaxCompute。