Spark-Sql RewriteDistinctAggregates

这个文章是记录
org.apache.spark.sql.catalyst.optimizer.RewriteDistinctAggregates
如何重写count distinct

针对场景:
select
count(distinct id),
count(distinct age),
sum(age)
from student
group by grade

请添加图片描述

expand:
请添加图片描述
说明gid的数据内容就是上图expand显示的样子
因为存在count(distinct age) 和sum(age) ,所以在projection 中,会有针对age 有两列。
这个bage 就是sum(age),因为在底层是 sum(CAST((age) AS BIGINT)) 所以这个就写成了bage

session.sql(
“”"
| select
| id,
| age,
| gid,
| grade,
| sum(CAST((bage) AS BIGINT)) AS col1
| from gid
| group by
| id,age,gid,grade
| order by gid
|“”".stripMargin).show()

在这里插入图片描述

session.sql(
“”"
|select
| grade,
| count(if(gid = 1 ,age ,null)) as age_cnt,
| count(if(gid = 2 ,id ,null)) as id_cnt,
| first(if(gid = 0 ,col1,null),true) as col1
|from
|(
| select
| id,
| age,
| gid,
| grade,
| sum(CAST((bage) AS BIGINT)) AS col1
| from gid
| group by
| id,age,gid,grade
| order by gid
| )foo
| group by grade
|“”".stripMargin).show()

在这里插入图片描述

原始计算

session.sql(
“”"
|
|select
| grade,
| count(distinct age) as age_cnt,
| count(distinct id) as id_cnt,sum(age)
|from student
|group by grade
|“”".stripMargin).show

在这里插入图片描述

expand的规则:请添加图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值