Hive 中的 NTILE 函数性能

Posted

技术标签:

【中文标题】Hive 中的 NTILE 函数性能【英文标题】:NTILE function performance in hive 【发布时间】:2020-04-07 09:41:43 【问题描述】:

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

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

这里的 score 变量代表 12 位十进制值。

到目前为止,所有负载都被转储到一个减速器上,这在完成 99% 后需要很长时间。有什么方法可以优化它,因为当前查询大约需要 35 分钟。执行。

感谢任何回应。

提前致谢。

【问题讨论】:

【参考方案1】:

这不是一个完整的答案,但它可能会提供一些指导。

问题是窗口函数中缺少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 BYJOIN 应该更好地利用并行硬件。

【讨论】:

以上是关于Hive 中的 NTILE 函数性能的主要内容,如果未能解决你的问题,请参考以下文章

hive窗口函数使用详解

关于 pyspark windows 函数中的 ntile 函数

Ntile和decile函数取决于R [duplicate]中的两列

C#中的NTILE函数等效

大数据之Hive:Hive 开窗函数

MySql窗口函数