共计 2320 个字符,预计需要花费 6 分钟才能阅读完成。
简介: MaxCompute 通过脚本模式反对 IF ELSE 分支语句,让程序依据条件主动抉择执行逻辑,反对更好的解决因数据不同而须要采纳不同策略的业务场景产生的简单 SQL,进步开发者编程的灵活性!
MaxCompute(原 ODPS)是阿里云自主研发的具备业界领先水平的分布式大数据处理平台, 尤其在团体外部失去广泛应用,撑持了多个 BU 的外围业务。MaxCompute 除了继续优化性能外,也致力于晋升 SQL 语言的用户体验和表达能力,进步宽广 MaxCompute 开发者的生产力。
MaxCompute 基于 MaxCompute2.0 新一代的 SQL 引擎,显著晋升了 SQL 语言编译过程的易用性与语言的表达能力。咱们在此推出深刻 MaxCompute 系列文章
第一弹 – 善用 MaxCompute 编译器的谬误和正告
第二弹 – 新的根本数据类型与内建函数
第三弹 – 简单类型
第四弹 – CTE,VALUES,SEMIJOIN
第五弹 – SELECT TRANSFORM
第六弹 – User Defined Type
第七弹 – Grouping Set, Cube and Rollup
第八弹 – 动静类型函数
第九弹 – 脚本模式与参数视图
上一篇介绍了脚本模式,能够理解到脚本模式执行时是作为一个整体进行编译、提交,生成一个执行打算实现一次排队一次执行可充分利用资源,这个过程能够看到残缺的执行打算给开发者提供更多的优化机会,且书写天然对习惯用一般编程语言形式书写的开发者更敌对。
更重要的是 脚本模式反对 IF ELSE 分支语句,能够让程序依据条件主动抉择执行逻辑。如脚本须要可能依照日期单双号抉择不同的逻辑;脚本可能依据一个 TABLE 的行数采取不同的策略等业务场景,这个个性就能够很好的解决这类业务场景产生的简单 SQL,给了 SQL 开发者更多的操作空间。
本文中有例子采纳 MaxCompute Studio 作展现,装置 MaxCompute Studio 的能够参照装置 MaxCompute Studio 相干文档进行装置并应用。
IF ELSE 分支语句
语法格局
Max Compute 的 IF 语法有以下几种:IF (condition) BEGIN
statement 1
statement 2
...
END
IF (condition) BEGIN
statements
END ELSE IF (condition2) BEGIN
statements
END ELSE BEGIN
statements
END
留神:
- 当 BEGIN 和 END 外部只有 1 条语句,则能够省略。(相似于 Java 中的 '{}’)。
- 多个 IF-ELSE 能够互相嵌套应用。
-
Condition 有 2 种,别离是 Boolean 表达式,和 Boolean 的 Scalar subquery。
- Boolean 表达式的 IF-ELSE 能够在编译阶段决定执行哪个分支如
从 MaxCompute Studio 的执行图能够看到,最终的作业只执行了 src1 的分支
- Scalar Subquery,这种类型的 IF ELSE 在编译阶段无奈决定执行哪个分支。如下内容编译器并不知道 tb_1 表中的数据,因而不能决定 Condition 是 true 还是 false,而是在运行时能力决定。因而,须要提交多个作业。
由下图 MaxCompute Job 执行图能够看到,这个工作一共提交了 2 个作业。
其中,第一个计算
(SELECT count(*) FROM tb_1 ) > 1
第二个计算残余的局部。
执行后果如下图:
- Boolean 表达式的 IF-ELSE 能够在编译阶段决定执行哪个分支如
示例
对于简单的 sql 来说,经常有蕴含 if else 的逻辑,例如如下:
select a.id
, greatest(b.c1, c.c1) as c1
, greatest(b.c2, c.c2) as c2
..
from (select * from ta) a
left outer join (
select * from(select tx.id , ty.c1 ,ty.c2
(
select *
from foo ) tx
join
(
select *
from bar
) ty on tx.id2=ty.id2
) b on a.id= b.id
left outer join (select * from tc)c on a.id=c.id ;
因为业务发生变化,数据能与 b 表关联上的比拟少,很多时候 b 表是空,然而偶然有肯定的流量。表 bar 数据量比拟大,意味着 foo join bar 代价较高。所以心愿脚本能实现这样的逻辑:当 b 表的流量为 0 的时候,扭转 sql 执行逻辑只与 tc 关联。能够用 if else 分支语句如下:
@a := select * from ta;
@b :=SELECT tx.id
,ty.c1
,ty.c2 (SELECT * FROM foo) tx
JOIN (
SELECT *
FROM bar
) ty
ON tx.id2 = ty.id2;
@c := select * from tc;
@select_expr table (id bigint ,c1 string,c2 string ...);
IF (cast( (select count(*) as cnt from @b ) as int) == 0 ) BEGIN
@select_expr := select a.id
, c. c1
, c.c2
...
from @a
left outer join
@c on a.id=c.id;
END ELSE BEGIN
@select_expr := select a.id
, greatest(b.c1, c.c1) as c1
, greatest(b.c2, c.c2) as c2
..
from @a a left outer join @b on a.id= b.id
left outer join @c on a.id=c.id;
大节
MaxCompute 基于 ODPS 2.0 的 SQL 引擎,提供了 IF-ELSE 分支语句,能够进步开发者编程的灵活性!
MaxCompute 平台致力于继续晋升 SQL 语言的表达能力,让咱们期待下一弹内容。