ODPS Script節點的SQL開發模式是MaxCompute基於2.0的SQL引擎提供的指令碼開發模式。
背景資訊
編譯指令碼時,ODPS Script節點可以將一個多語句的SQL指令檔作為一個整體進行編譯,無需逐條語句進行編譯。將其作為一個整體提交運行,可以保證一個執行計畫一次排隊、一次執行,充分利用MaxCompute的資源。Script Mode的SQL編譯較為簡單,您只需要按照商務邏輯,用類似於普通程式設計語言的方式進行編譯,無需考慮如何組織語句。
--SET語句
set odps.sql.type.system.odps2=true;
[set odps.stage.reducer.num=***;]
[...]
--DDL語句
create table table1 xxx;
[create table table2 xxx;]
[...]
--DML語句
@var1 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table3
[WHERE where_condition];
@var2 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table4
[WHERE where_condition];
@var3 := SELECT [ALL | DISTINCT] var1.select_expr, var2.select_expr, ...
FROM @var1 join @var2 on ...;
INSERT OVERWRITE|INTO TABLE [PARTITION (partcol1=val1, partcol2=val2 ...)]
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM @var3;
[@var4 := SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var1
UNION ALL | UNION
SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var2;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
AS
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM var4;]
ODPS Script節點的使用限制如下:
- 指令碼模式支援SET語句、部分DDL語句(結果是屏顯類型的語句除外,例如
desc
、show
)和DML語句。 - 一個指令碼的完整形式是SET語句>DDL語句>DML語句。每種類型語句都可以有0到多個語句,但不同類型的語句不能混合。
- 多個語句以@開始,表示變數串連。
- 一個指令碼,目前最多支援一個螢幕顯示結果的語句(例如單獨的Select語句),否則會報錯。不建議您在指令碼中執行螢幕顯示的Select語句。
- 一個指令碼,目前最多支援一個
Create table as
語句,並且必須是最後一句。建議將建表語句和Insert語句分開寫。 - 指令碼模式下,如果有一個語句失敗,整個指令碼的語句都不會執行成功。
- 指令碼模式下,只有所有輸入的資料都準備完成,才會產生一個作業進行資料處理。
- 指令碼模式下,如果一個表被寫入後又被讀取,會報錯。
insert overwrite table src2 select * from src where key > 0; @a := select * from src2; select * from @a;
為避免先寫後讀,可以進行如下修改。@a := select * from src where key > 0; insert overwrite table src2 select * from @a; select * from @a;
樣本如下。create table if not exists dest(key string , value bigint) partitioned by (d string); create table if not exists dest2(key string,value bigint ) partitioned by (d string); @a := select * from src where value >0; @b := select * from src2 where key is not null; @c := select * from src3 where value is not null; @d := select a.key,b.value from @a left outer join @b on a.key=b.key and b.value>0; @e := select a.key,c.value from @a inner join @c on a.key=c.key; @f := select * from @d union select * from @e union select * from @a; insert overwrite table dest partition (d='20171111') select * from @f; @g := select e.key,c.value from @e join @c on e.key=c.key; insert overwrite table dest2 partition (d='20171111') SELECT * from @g;
指令碼模式適用於以下情境:- 指令碼模式更適合用於改寫需要層層嵌套子查詢的單個語句,或因為指令碼複雜性而不得不拆成多個語句的指令碼。
- 多個輸入的資料來源資料準備完成的時間相差很大(例如一個淩晨1點可以準備好,另一個上午7點可以準備好),不適合通過table variable銜接,可以拼接為一個大的指令碼模式SQL。
操作步驟
進入資料開發頁面。
登入DataWorks控制台,切換至目標地區後,單擊左側導覽列的 ,在下拉框中選擇對應工作空間後單擊進入資料開發。
- 滑鼠移至上方至表徵圖,單擊 。 您也可以開啟相應的商務程序,按右鍵MaxCompute,選擇。
在建立節點對話方塊中,輸入節點名稱,並選擇路徑。
單擊確認。
- 在節點的編輯頁面編輯指令碼,詳情請參見開發及提交SQL指令碼。
- 單擊節點編輯地區右側的調度配置,配置節點的調度屬性,詳情請參見配置基礎屬性。
儲存並提交節點。
重要您需要設定節點的重跑屬性和依賴的上遊節點,才可以提交節點。
單擊工具列中的表徵圖,儲存節點。
單擊工具列中的表徵圖。
在提交新版本對話方塊中,輸入變更描述。
單擊確認。
如果您使用的是標準模式的工作空間,提交成功後,請單擊右上方的發布。具體操作請參見發布任務。
任務營運,詳情請參見周期任務基本營運操作。