sparksql比hivesql优化的点(窗口函数)

本文探讨了SparkSQL与HiveSQL在处理窗口函数时的优化差异,指出SparkSQL能有效合并相同或可复用的窗口,提高效率。通过示例展示了SparkSQL如何在计算row_number()和sum(rank())时复用窗口,而HiveSQL则未进行此类优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,一个 select 语句中包含多个窗口函数,它们的窗口定义(OVER 子句)可能相同、也可能不同。

 

对于相同的窗口,完全没必要再做一次分区和排序,我们可以将它们合并成一个 Window 算子。

select 
    id,
    sq,
    cell_type,
    rank,
    row_number() over(partition by id  order by rank ) naturl_rank,
    rank() over(partition by id order by rank) as r,
    dense_rank() over(partition by  cell_type order by id) as dr  
 from window_test_table 
 group by id,sq,cell_type,rank;

row_number() , rank() 的窗口一样,可以放在一次分区和排序中完成,这一块hive sql与spark sql的表现是一致的。

但对于另外一种情况:

select
    id,
    rank,
    row_number() over(partition by id  order by rank ) naturl_rank,
    sum(rank) over(partition by id) as snum
 from window_test_table

​虽然这 2 个窗口并非完全一致,但是 sum(rank) 不关心分区内的顺序,完全可以复用 row_number() 的窗口。

从下面执行计划可以看出,spark sql sum(rank) 和row_number() 复用了同一个窗口,而hive sql没有。

spark sql的执行计划:

spark-sql>  explain select  id,rank,row_number() over(partition by id  order by rank ) naturl_rank,sum(rank) over(partition by id) as snum from window_test_table;
      
== Physical Plan ==
*(3) Project [id#13, rank#16, naturl_rank#8, snum#9L]
+- Window [row_number() windowspecdefinition(id#13, rank#16 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS naturl_rank#8], [id#13], [rank#16 ASC NULLS FIRST]
   +- *(2) Sort [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萝卜算子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值