java case when用法_sql case when 嵌套

java case when用法_sql case when 嵌套前几天在客户环境遇到一个Spark“CASEWHEN”语句的性能优化问题。客户那边通过一个“时间范围筛选”控件来动态修改图表的数据。其很多指标的计算逻辑类似于:CASEWHEN`bizdate`BETWEEN’2020-09-06’AND’2020-09-13’THEN`sales_amount`ELSE0ENDCASEWHEN语句有些类似于编程语言中的Switch语句,当这里的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前几天在客户环境遇到一个Spark “CASE WHEN”语句的性能优化问题。

客户那边通过一个“时间范围筛选”控件来动态修改图表的数据。其很多指标的计算逻辑类似于:

CASE

WHEN `bizdate`

BETWEEN ‘2020-09-06’ AND ‘2020-09-13’

THEN `sales_amount`

ELSE 0

END

CASE WHEN语句有些类似于编程语言中的Switch语句,当这里的 WHEN从句只有一个的时候,可以简化为IF语句(或者 IF-ELSE 语句)。

于是想:对于Spark(客户用的是2.4.x版本), Spark会不会把这种只有一个WHEN分支的 CASE WHEN 语句优化为IF语句呢? 于是试了一下性能,发现如果修改上面的SQL为:

IF(`bizdate`

BETWEEN ‘2020-09-06’ AND ‘2020-09-13’,

`sales_amount`,

0

)

那么执行速度将减少为原来的一半! 原来Spark 2.4并没有做这个优化,突然感到有些兴奋。那是不是我的机会来了。

首先、这个应该是一个比较简单的优化,比如我是否可以通过增加一个Spark的优化器规则,来自动把一个分支的CASE WHEN转为IF,看着好像不难。

不过在真正动手前,先看看: Spark的最新版本是否已经有了这个修改?

于是先看看 CASE When 语句的实现,发现最新的发布版本(Spark 3.0.1)的代码是这样的:

override def doGenCode(ctx: CodegenContext,

ev: ExprCode): ExprCode = {

if (branches.length == 1) {

// If we have only single branch we can use If expression and its codeGen If(

branches(0)._1,

branches(0)._2,

elseValue

.getOrElse(Literal.create(null, branches(0)._2.dataType)))

.doGenCode(ctx, ev)

} else {

multiBranchesCodegen(ctx, ev)

}

}

发现,在Spark转化执行代码为 Java时(doGenCode),其已经对于分支为1的情况,做了自动转化为 IF 语句的操作。

虽然我感觉更适合放在优化器中做,不过直接修改 CaseWhen 这个类的 doGenCode() 可能简单直接! 从这个修改的PR的diff来看也确实如此(只改了几行代码):

首先,发现其 “Fix Version/s: 3.0.0”,果然是3.0才优化的。

其描述问题时的重现步骤:

val df = spark.range(10000000000L).withColumn(“x”, rand)

val resultA = df.withColumn(“r”, when($”x” < 0.5, lit(1)).otherwise(lit(0))).agg(sum($”r”))

val resultB = df.withColumn(“r”, expr(“if(x < 0.5, 1, 0)”)).agg(sum($”r”))

resultA.collect() // takes 56s to finishresultB.collect() // takes 30s to finish

发现其在spark旧版本中 IF 比 CaseWhen 要快很多 (30秒 vs 56秒)

虽然没有为Spark贡献成,但是也了解到了Spark 3.0的一些细节优化已经可以解决现在的一些实际问题了,Spark 3.0.1 值得期待应用到产品中!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196875.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在asp.net mvc中使用PartialView返回部分HTML段

    在asp.net mvc中使用PartialView返回部分HTML段

    2021年12月6日
    46
  • 使用BoundsChecker「建议收藏」

     BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。              BoundsChecker能检测的错误包括:3sNews.Net——3S社区&资讯平台tbU^N@i7pwMVBe    1)指针操作和内存、资源泄露错误,比如:内存泄露;资源泄露;对指针变量的错误操作。   

    2022年4月7日
    54
  • 在pycharm中配置anaconda环境_anaconda pycharm环境配置

    在pycharm中配置anaconda环境_anaconda pycharm环境配置在pycharm中如果出现了nopythoninterpreterconfiguredfortheproject表示你没有给这个工程提供一个解释器如果已经安装pychrm在后期怎么配置解释器呢:![在这里插入图片描述](https://img-blog.csdnimg.cn/20210713171532445.png)file中选择setting然后点击右边的设置,Add进行配置,还是进入systeminterpreter,需要注意的是在Pycharm中选择错了anaconda.

    2022年8月28日
    8
  • Android json字符串转Map

    Android json字符串转Map今天,同事问我json的问题。遍历json数组,解决完以后。我想到了json转Map这个问题。写一下,发现效果还行那个发上来看看吧。如果想省事的话,用阿里的FastJson我感觉也是不错的,网上教程很多,我就不多说了。注意这是Android自带的json包importorg.json.JSONArray;importorg.json.JSONException;importo…

    2022年6月21日
    228
  • iOS iOS 地图与定位开发系列教程

    iOS iOS 地图与定位开发系列教程iPhoneSDK提供了三个类来管理位置信息:CLLocationCLLocationManager和CLLHeading(不常用)。除了使用GPS来获取当前的位置信息外,iPhone也可以基于WiFi基站和无线发射塔来获得位置信息。GPS的精度最高,可以精确到米级别,但是也最耗电。1、CLLocationCLLocation类代表一个位置信息,其中还包括了方向和速度。比如我在长安街188号以5公里/小时的速度往西走。CLLocation具有下面的属性和方法:@property.

    2022年7月26日
    4
  • git的面试题_es面试题

    git的面试题_es面试题GIT常见面试题1. 列举工作中常用的几个git命令?新增文件的命令:gitaddfile或者gitadd.提交文件的命令:gitcommit–m或者gitcommit–a查看工作区状况:gitstatus–s拉取合并远程分支的操作:gitfetch/gitmerge或者gitpull查看提交记录命令:gitreflog2. 提交时发生冲突,你能解释冲突是…

    2022年4月19日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号