配置单元中的sql函数性能

fbcarpbf  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(305)

有没有什么方法可以优化ntile函数的运行时间。目前,我们有大约5100万条记录和17个变量。我们正在执行下面的查询,将数据集划分为100个bucket。

create table secondary_table  
stored as orc 
as
select a.*,NTILE(100) OVER(ORDER BY score) AS score_rank
from main_table a;

这里的分数变量表示12位十进制值。
到目前为止,所有的负载都被卸载到一个减速机上,完成99%的减速机需要很多时间。有什么方法可以优化它,因为当前的查询大约需要35分钟才能执行。
感谢您的回复。
提前谢谢。

9gm1akwq

9gm1akwq1#

这不完全是一个答案,但它可能会提供一些指导。
问题是缺乏 partition by 在窗口函数中。用等价的构造替换它, row_number() 以及 count(*) 不会有帮助的。
当我遇到这个问题时,我可以用两种方法中的一种来解决它。
如果有大量重复,则聚合并使用累计和来定义分幅。
否则,请将值分组。
作为第二个例子。假设分数在0到1000之间,分布相当均匀。然后:

select t.*,
       1 + floor((t.seqnum_within + tt.running_cnt - tt.cnt - 1) * 100 / cnt)
from (select t.*,
             row_number() over (partition by trunc(score) order by score) as seqnum_within
      from t
     ) t join
     (select trunc(score) as score_trunc, count(*) as cnt,
             sum(count(*)) over (order by min(score)) as running_cnt,
             sum(count(*)) over () as total_cnt
      from t
      group by trunc(score)
     ) tt
     on trunc(t.score) = score_trunc;

这个 GROUP BY 以及 JOIN 应该更好地利用并行硬件。

相关问题