全部產品
Search
文件中心

DataWorks:MaxCompute Script節點

更新時間:Nov 14, 2025

DataWorks提供MaxCompute Script節點,該節點支援基於MaxCompute 2.0 SQL引擎的指令碼開發模式。本文為您介紹MaxCompute Script節點的使用。

背景資訊

MaxCompute的SQL引擎支援指令碼模式(Script Mode),允許您將多條SQL語句整合為一個指令碼整體編譯執行,適用於處理複雜查詢(例如嵌套子查詢或需要分步操作的情況)。通過一次性提交整個指令碼,產生統一的執行計畫,作業只需排隊和執行一次,從而更高效地利用資源。更多使用詳情可參見SQL指令碼模式。在DataWorks中,您可以使用MaxCompute Script節點來建立和調度基於指令碼模式的任務。

適用情境

指令碼模式適用於需要被重寫的多層嵌套子查詢語句,或因複雜性而需拆分為多個語句的指令碼。

例如指令碼模式下,您可以對一個變數賦常量值,然後將SELECT * FROM 變數語句轉化為標量與其它列進行計算。常量值也可以存放在一個單行的表中,命令樣本如下。轉化文法請參見子查詢(SUBQUERY)

@a := SELECT 10; --對@a賦值常量10,或者賦值存在一個單行表t1中,SELECT col1 FROM t1。
@b := SELECT key,VALUE+(SELECT * FROM @a) FROM t2 WHERE key >10000; --t2表中value值與@a中的值進行計算。
SELECT * FROM @b;
說明

如果多個資料來源的資料準備完成時間間隔很長(例如一個在01:00準備好,另一個在07:00準備好),則不適合使用表變數來銜接並拼裝成一個大的指令碼模式SQL。

前提條件

文法結構

一個MaxCompute Script指令碼完整的形式為SET語句>DDL語句>DML語句,每種類型語句都可以有0到多個語句,但不同類型的語句不能混合。多個語句以@開始,表示變數串連。文法如下:

--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;]

使用限制

MaxCompute Script節點的使用限制如下:

  • 指令碼模式支援SET語句、部分DDL語句(結果是屏顯類型的語句除外,例如DESCSHOW)和DML語句。

  • 一個指令碼,目前最多支援一個螢幕顯示結果的語句(例如單獨的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;

建立MaxCompute Script節點

建立入口參考:建立MaxCompute Script節點

開發MaxCompute Script節點

在MaxCompute Script節點編輯頁面,您可根據實際業務需要,選擇下方Script範例程式碼進行業務開發。

基礎Script代碼開發

在MaxCompute的指令碼模式下,SQL編譯過程較為直觀,下面通過一個簡單樣本來介紹如何使用MaxCompute Script節點。

CREATE TABLE IF NOT EXISTS dest(key string , VALUE bigint) ;
CREATE TABLE IF NOT EXISTS dest2(key string,VALUE bigint ) ;
@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  SELECT * FROM @f;
@g := SELECT e.key,c.value  FROM @e JOIN @c ON e.key=c.key;
INSERT OVERWRITE TABLE dest2 SELECT * FROM @g;
進階Script代碼開發

MaxCompute指令碼模式支援IF語句,IF語句可以使程式根據條件自動選擇執行邏輯。MaxCompute的IF文法根據Condition類型分為BOOLEAN類型,以及BOOLEAN的Scalar SubQuery。

  • IF條件為BOOLEAN類型運算式

    這種類型的IF ELSE語句可以在編譯階段決定執行哪個分支,樣本如下:

    --資料處理
    SET odps.sql.allow.fullscan=true;
    SET odps.optimizer.cbo.rule.filter.black=LM; 
    @date := '${var}';
    @row  TABLE(key int,VALUE bigint); --聲明變數row,其類型為Table,schema為string. 
    IF ( cast(@date  AS bigint) % 2 == 0 ) BEGIN 
    @row  := SELECT key,VALUE FROM src1; 
    END ELSE BEGIN
    @row  := SELECT key,VALUE FROM src2; 
    END
    INSERT OVERWRITE TABLE dest1 PARTITION(p='${var}')  SELECT key,VALUE FROM @row; 
    說明

    代碼中定義了名為var的變數,您需要在調度參數配置處為var變數進行賦值。

  • IF條件為BOOLEAN的Scalar SubQuery

    這種類型的IF ELSE語句在編譯階段無法決定執行哪個分支,而是在運行時才能決定。因此,需要提交多個作業,樣本如下:

    @i bigint;
    @t TABLE(id bigint, VALUE bigint);
    IF ((SELECT count(*) FROM src WHERE a = '5') > 1) BEGIN
    @i := 1;
    @t := SELECT @i, @i*2;
    END ELSE
    BEGIN
    @i := 2;
    @t := SELECT @i, @i*2;
    END
    SELECT id, VALUE FROM @t; 
  • 嵌入式UDF開發

    此外,您也可以通過將Java或Python代碼嵌入SQL指令碼的方式,使用MaxCompute指令碼模式實現代碼嵌入式UDF(Embedded UDF)開發,詳情請參見UDF(嵌入式)

調試MaxCompute Script節點

  1. 在節點編輯頁右側的調試配置中配置相關參數。

    參數

    配置說明

    計算資源

    選擇您已綁定的MaxCompute計算資源。

    計算配額

    選擇您所建立的計算配額(Quota),為計算作業提供所需計算資源(CPU及記憶體)。

    如無可用計算配額,可在下拉式清單中單擊建立計算配額,在MaxCompute控制台建立配置Quota

    資源群組

    選擇與計算資源測試連通性成功的調度資源群組。詳情請參見網路連通方案

  2. 在工具列的參數對話方塊中選擇已建立的MaxCompute資料來源,單擊運行MaxCompute Script任務。

後續步驟

  • 節點調度:若專案目錄下的節點需要周期性調度執行,您需要在節點右側的調度配置中設定調度策略,配置相關的調度屬性。

  • 節點發布:若任務需要發布至生產環境執行,請單擊介面image表徵圖喚起發布流程,通過該流程將任務發布至生產環境。專案目錄下的節點只有在發布至生產環境後,才會進行周期性調度。

建表語句與測試資料樣本

樣本如下:

--建立表
CREATE TABLE IF NOT EXISTS src(key string ,VALUE BIGINT);
INSERT INTO src VALUES ('1',11) ;
INSERT INTO src VALUES ('1',11) ;
CREATE TABLE IF NOT EXISTS  src2(key string ,VALUE BIGINT);
INSERT INTO src2  VALUES ('1',22);
INSERT INTO src2  VALUES ('2',22);
CREATE TABLE IF NOT EXISTS  src3(key string ,VALUE BIGINT);
INSERT INTO src3 VALUES ('1',33);
INSERT INTO src3 VALUES ('3',33);