写点什么

深入 MaxCompute - 第十弹 -IF ELSE 分支语句

  • 2023-08-31
    浙江
  • 本文字数:1871 字

    阅读完需:约 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 statementsEND ELSE IF (condition2) BEGIN statementsEND ELSE BEGIN statementsEND
复制代码


注意:


  • 当 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

  • 第二个计算剩余的部分。

  • 执行结果如下图:

示例

对于复杂的 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 ) txJOIN    (            SELECT  *            FROM    bar        ) tyON      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.idleft outer join @c on a.id=c.id;
复制代码

小节

MaxCompute 基于 ODPS 2.0 的 SQL 引擎,提供了 IF-ELSE 分支语句,可以提高开发者编程的灵活性!


MaxCompute 平台致力于持续提升 SQL 语言的表达能力,让我们期待下一弹内容。

发布于: 10 分钟前阅读数: 9
用户头像

还未添加个人签名 2020-10-15 加入

分享阿里云计算平台的大数据和AI方向的技术创新和趋势、实战案例、经验总结。

评论

发布
暂无评论
深入MaxCompute -第十弹 -IF ELSE分支语句_阿里云大数据AI技术_InfoQ写作社区