Hive 有效地将一列的最小值与另一列作为键

Hive 有效地将一列的最小值与另一列作为键,hive,hiveql,Hive,Hiveql,我最近从使用Presto过渡到使用Hive。我有下面的场景。列A,B,C。我想对A进行聚合,找到B的值,其中C的值最小。在普雷斯托,你可以像这样 从A组中选择A、min_byB、C 现在我想在蜂箱里做同样的事情。但不幸的是,我在文档中找不到类似的UDF。现在我知道我可以做到以下几点 SELECT A, COALESCE(B, 0) from <TABLE> as primary JOIN ( SELECT A, MIN(C) as C FROM <TABLE> GROUP

我最近从使用Presto过渡到使用Hive。我有下面的场景。列A,B,C。我想对A进行聚合,找到B的值,其中C的值最小。在普雷斯托,你可以像这样 从A组中选择A、min_byB、C 现在我想在蜂箱里做同样的事情。但不幸的是,我在文档中找不到类似的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
这个解决方案有两个问题

一点也不简洁。 效率也不高。我正在做一个额外的子查询结果、一个额外的聚合和一个额外的连接。如果能为这样一个函数提供一流的聚合支持,那就太好了。
有没有一种方法可以在不编写自定义自定义UDF的情况下实现我的目标?

Join的工作速度比分析函数慢,在不使用Join的情况下尝试这种方法,表将只扫描一次:

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;

如果需要通过更多的组列计算minC,请将它们添加到partition by子句。

您可以在配置单元中尝试TD_firstB,C。同样的工作方式。

为什么不对数据进行排序,然后取头,而不是选择最小值@kpie你能给我一个我将如何做的示例查询吗?我所能想到的方法比当前的方法差一点。你能发布示例输入以便我们可以处理解决方案吗?Hive支持标准SQL分析函数,具有一些特殊性>手册不可用作教程,因此请查找关于MINx通过a分区、b作为xx分区或类似sthg分区的教程