MaxCompute Script节点

更新时间:2025-02-05 09:15:23

DataWorks提供MaxCompute Script节点,该节点支持基于MaxCompute 2.0 SQL引擎的脚本开发模式。本文为您介绍MaxCompute Script节点的使用。

背景信息

MaxComputeSQL引擎支持脚本模式(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。

前提条件

  • (可选,RAM账号需要)进行任务开发的RAM账号已被添加至对应工作空间中,并具有开发空间管理员(权限较大,谨慎添加)角色权限,添加成员的操作详情请参见为工作空间添加空间成员

    说明

    如果您使用的是主账号,则忽略该添加操作。

  • 已开发创建项目目录,详情请参见项目目录

  • 已创建MaxCompute Script节点,详情请参见创建任务节点

  • MaxCompute中创建任务所需表,并添加示例数据,详情请参见建表语句与测试数据示例

语法结构

一个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;

操作步骤

  1. MaxCompute Script节点编辑页面,执行如下开发操作。

    Script代码开发

    您可根据实际业务需要,选择下方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;

    MaxCompute脚本模式支持IF语句,IF语句可以使程序根据条件,自动选择执行逻辑。MaxComputeIF语法根据Condition类型分为BOOLEAN类型,以及BOOLEANScalar 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条件BOOLEANScalar 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开发

      此外,您也可以通过将JavaPython代码嵌入SQL脚本的方式,使用MaxCompute脚本模式实现代码嵌入式UDF(Embedded UDF)开发,详情请参见UDF(嵌入式)

    执行Script任务

    1. 调试配置计算资源中,选择配置计算资源、计算配额DataWorks资源组

      说明

      访问公共网络或VPC网络环境的数据源需要使用与数据源测试连通性成功的调度资源组。详情请参见网络连通方案

    2. 在工具栏的参数对话框中选择已创建的MaxCompute数据源,单击运行Script任务。

  2. 如需定期执行节点任务,请根据业务需求配置调度信息。配置详情请参见调度配置

  3. 节点任务配置完成后,需对节点进行发布。详情请参见节点发布

  4. 任务发布后,您可以在运维中心查看周期任务的运行情况。详情请参见运维中心入门

建表语句与测试数据示例

示例如下:

--创建表
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);
  • 本页导读 (1)
  • 背景信息
  • 适用场景
  • 前提条件
  • 语法结构
  • 使用限制
  • 操作步骤
  • 建表语句与测试数据示例
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等