Hive如何为每组分组结果获取非分组列?

时间:2016-06-01 23:05:02

标签: hadoop hive

我有一张类似于以下内容的表格。

|name  |   grp   |  dt    
------------------------------   
|foo   |    A    |  2016-01-01
|bar   |    A    |  2016-01-02
|hai   |    B    |  2016-01-01
|bai   |    B    |  2016-01-02
|baz   |    C    |  2016-01-01

对于每个群组,我想找到name最近的dt。换句话说,MAX(dt),GROUP by grp,并将其dt为组的最大值的名称与输出相关联:

|name  |   grp   |  dt    
------------------------------
|bar   |   A     | 2016-01-02
|bai   |   B     | 2016-01-02
|baz   |   C     | 2016-01-01

在Oracle中,以下查询有效并且非常干净(取自here):

SELECT o.name, o.grp, o.dt 
FROM tab o
     LEFT JOIN tab b
         ON o.grp = b.grp AND o.dt < b.dt
WHERE b.dt IS NULL

然而,[Error 10017]: Line 4:43 Both left and right aliases encountered in JOIN 'service_effective_from' window.addEventListener ("hashchange", fireOnNewPage, false); function fireOnNewPage () { // console.log ("Fired"); } 引用了question引用了documentation,我知道我无法在连接语句中使用不等式运算符:

  

Hive仅支持等同连接,外连接和左半连接。 Hive不支持非平等条件的连接条件,因为很难表达map / reduce作业等条件。

在Hive中获取此项的干净解决方案是什么,因为我不能在连接条件下使用不等式运算符?

1 个答案:

答案 0 :(得分:0)

以下作品取自here,但我发现它不是很干净:

SELECT o.name, ogrp, o.dt
FROM tab o
    JOIN (
        SELECT grp, MAX(dt) dt
        FROM tab
        GROUP BY grp
    ) b
        ON o.grp = b.grp AND o.dt = b.dt

另外,对于具有4行的可比测试表,我的环境需要164秒。