全部產品
Search
文件中心

MaxCompute:建立ODPS Script節點

更新時間:Jun 19, 2024

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語句(結果是屏顯類型的語句除外,例如descshow)和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。

操作步驟

  1. 進入資料開發頁面。

    登入DataWorks控制台,切換至目標地區後,單擊左側導覽列的資料建模與開發 > 資料開發,在下拉框中選擇對應工作空間後單擊進入資料開發

  2. 滑鼠移至上方至建立表徵圖,單擊建立節點 > MaxCompute > ODPS Script
    您也可以開啟相應的商務程序,按右鍵MaxCompute,選擇建立節點 > ODPS Script
  3. 建立節點對話方塊中,輸入節點名稱,並選擇路徑

  4. 單擊確認

  5. 在節點的編輯頁面編輯指令碼,詳情請參見開發及提交SQL指令碼
  6. 單擊節點編輯地區右側的調度配置,配置節點的調度屬性,詳情請參見配置基礎屬性
  7. 儲存並提交節點。

    重要

    您需要設定節點的重跑屬性依賴的上遊節點,才可以提交節點。

    1. 單擊工具列中的儲存表徵圖,儲存節點。

    2. 單擊工具列中的提交表徵圖。

    3. 提交新版本對話方塊中,輸入變更描述

    4. 單擊確認

    如果您使用的是標準模式的工作空間,提交成功後,請單擊右上方的發布。具體操作請參見發布任務

  8. 任務營運,詳情請參見周期任務基本營運操作