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 BY
和JOIN
应该更好地利用并行硬件。
【讨论】:
以上是关于Hive 中的 NTILE 函数性能的主要内容,如果未能解决你的问题,请参考以下文章
关于 pyspark windows 函数中的 ntile 函数