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

6rqinv9w  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(437)

我有一张类似下面的table。

|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为组的max的名称与输出相关联:

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

在oracle中,以下查询工作正常且非常干净(取自此处):

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' 从引用文档的另一个问题中,我了解到我不能在join语句中使用不等式运算符:
配置单元中仅支持相等联接、外部联接和左半联接。配置单元不支持非相等条件的联接条件,因为很难将此类条件表示为map/reduce作业。
如果我不能在连接条件中使用不等式运算符,那么在配置单元中获得该表达式的干净解决方案是什么?

lqfhib0f

lqfhib0f1#

下面的作品是从这里取材的,但我觉得不是很干净:

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秒。

相关问题