简介: 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语言的表达能力,让咱们期待下一弹内容。
发表回复