【问题标题】:Hive How to get non-grouped columns for each group of grouped results?Hive 如何为每组分组结果获取非分组列?
【发布时间】:2023-03-14 05:54:01
【问题描述】:

我有一个类似下面的表格。

|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' 失败了 从另一个 question 引用 documentation,我了解到我不能在连接语句中使用不等式运算符:

Hive 仅支持等式连接、外连接和左半连接。 Hive 不支持非相等条件的连接条件,因为很难将此类条件表示为 map/reduce 作业。

鉴于我不能在连接条件中使用不等式运算符,在 Hive 中获得此内容的干净解决方案是什么?

【问题讨论】:

  • 如果您想查找name 其dt 是每个组中最新的,那么为什么要返回foo?它与2016-01-01 相关联,这不是A 组中最新的。
  • @GoBrewers14 我很抱歉;你是对的;我已将其编辑为bar

标签: hadoop hive


【解决方案1】:

以下内容有效,取自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 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多