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

简介:  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
      第二个计算剩余的部分。
      执行结果如下图:

示例

对于复杂的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语言的表达能力,让我们期待下一弹内容。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/u/5583868/blog/10106059

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。