深入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
第二个计算剩余的部分。
执行结果如下图:
- 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语言的表达能力,让我们期待下一弹内容。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微软不讲武德,用“恶意弹窗”提示用户弃用 Google
科技媒体 The Verge 报道了微软在 Windows 11 中使用了类似恶意软件的弹窗,目的是要求用户将 Chrome 中的默认搜索引擎从 Google 切换到 Bing。 作者在文章中提到,自己原本在使用 Chrome 处理事情,然后切换到了游戏,突然这时候出现了一个弹出窗口,要求他将 Chrome 中的默认搜索引擎从 Google 切换为 Microsoft Bing。 他被微软这个操作震惊到了——只因使用的是 Chrome 而非 Edge,微软就在系统界面最顶层弹出窗口提醒自己切换工具。 作者还发现,该弹窗不是一个正常的通知窗口。因为它没有出现在 Windows 11 的通知中心中,也没有关联到 Windows 11 的「向您推荐新功能」。它是一个恶意可执行文件,以某种方式出现在 c:\windows\temp\mubstemp 中,并由 Microsoft 进行了数字签名。 微软公关总监 Caitlin Roulston 在一份声明中表示已经暂停此通知,同时展开调查采取恰当行动以解决这一非预期行为。
- 下一篇
稳定性建设框架 | 京东物流技术团队
一、为什么要做稳定性建设 1、从熵增定律引出稳定性建设的必要性 物理学上,用“熵”来描述一个体系的混乱程度。卡尔·弗里德曼提出熵增定律,他认为在一个封闭的系统内,如果没有外力的作用,一切物质都会从有序状态向无序状态发展。 如果我们不希望系统变混乱,有什么办法呢?答案是对抗熵增定律,对抗熵增定律的方法是借助外力,让系统从混乱回归有序。举个例子: 下图中,我们使用“熵”值来衡量“骰子系统”的混乱程度,1(最大值)表示“最混乱”,意味着我们不能控制“投骰子”的结果,每次投骰子的结果会在1~6随机出现,系统表现不稳定;1/6(最小值)表示“最有序”,意味着我们能够控制“投骰子”的结果,系统表现稳定,比如我们希望每次投筛子的结果都是6,我们可以引入作弊手段(即借助外力),让每次投骰子结果都是6。 熵增定律同样适合软件系统,一个软件系统刚发布时是有序的,熵值趋于1,随着不断迭代,慢慢变成混乱的、脆弱的,从而导致线上问题频发,熵值趋于0,我们需要借助外力,即稳定性治理手段,提高系统熵值,让系统恢复稳定。 2、稳定性建设的意义 如下图分析,系统不稳定会产生真金白银的损失,因此,稳定性建设的意义是:不是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16