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. 进入数据开发页面。
    1. 登录DataWorks控制台
    2. 在左侧导航栏,单击工作空间列表
    3. 选择工作空间所在地域后,单击相应工作空间后的进入数据开发
  2. 鼠标悬停至新建图标,单击MaxCompute > ODPS Script
    您也可以打开相应的业务流程,右键单击MaxCompute,选择新建 > ODPS Script
  3. 新建节点对话框中,输入节点名称,并选择目标文件夹
    说明 节点名称必须是大小写字母、中文、数字、下划线(_)和小数点(.),且不能超过128个字符。
  4. 单击提交
  5. 在节点的编辑页面编辑脚本,详情请参见开发SQL脚本
  6. 单击节点编辑区域右侧的调度配置,配置节点的调度属性,详情请参见基础属性
  7. 保存并提交节点。
    注意 您需要设置节点的重跑属性依赖的上游节点,才可以提交节点。
    1. 单击工具栏中的保存图标,保存节点。
    2. 单击工具栏中的提交图标。
    3. 提交新版本对话框中,输入变更描述
    4. 单击确认
    如果您使用的是标准模式的工作空间,提交成功后,请单击右上角的发布。具体操作请参见发布任务
  8. 测试节点,详情请参见周期任务