有效地以其他列作为键的最小列

时间:2018-11-09 00:04:46

标签: hive hiveql

我最近从使用Presto过渡到Hive。我有以下情况。 A,B,C列。我想对A进行汇总,然后找到B的值,将C的值最小化。事先可以这样 SELECT A, min_by(B, C) from <TABLE> GROUP BY A 现在我想在Hive中做同样的事情。但是不幸的是,我在文档中的任何地方都找不到类似的UDF。现在我知道我可以做以下事情了

SELECT A, COALESCE(B, 0)
from <TABLE> as primary
JOIN (
SELECT A, MIN(C) as C FROM <TABLE> GROUP BY A 
) secondary
ON primary.A = secondary.A AND primary.C = secondary.C\
GROUP BY A

此解决方案有2个问题

  1. 一点也不简洁。
  2. 效率也不高。我正在做一个额外的子查询,一个额外的聚合和一个额外的JOIN。对此功能具有一流的聚合支持将是很好的。

是否可以在不编写自定义UDF的情况下实现我要执行的操作?

2 个答案:

答案 0 :(得分:2)

联接的工作速度比解析函数慢,请尝试不使用联接的此方法,并且表将仅扫描一次:

select s.*
from
(
SELECT A, COALESCE(B, 0) as B, C
      min(C) over (partition by A) as min_C
from <TABLE> as primary
)s
where s.C=s.min_C;

如果需要通过更多组列计算min(C),请将其添加到partition BY子句中。

答案 1 :(得分:0)

您可以在蜂巢中尝试TD_first(B,C)。以相同的方式工作。