【问题标题】:HIve query to find maximum value用于查找最大值的 Hive 查询
【发布时间】:2017-08-04 06:50:05
【问题描述】:

我有以下数据我想获取每个 ID 的最新分区时间

ID       time
12  10038446  201705102100
13  10038446  201706052100
14  10038446  201706060000
15  10038446  201706060100
16  10103517  201705101700
17  10103517  201705102100
18  10103517  201706052100
19  10103517  201706060100
20  10124464  201701310100
21  10124464  201702210500
22  10124464  201702220500
23  10124464  201703062100
24  10124464  201705102100
25  10124464  201706052100
26  10124464  201706060100

我期望的输出如下

15  10038446  201706060100
19  10103517  201706060100
26  10124464  201706060100
37  1019933 201706052100

如何使用 Hive 查询来实现这一点?

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案1】:

    试试这个

    select ID, time
    from
    (
      select 
        ID, 
        time, 
        row_number() over (partition by ID order by time desc) as time_rank
      from table_name
     ) x
    where time_rank = 1
    group by ID, time
    

    没有子查询(较低的 hive 版本),临时表是一种选择。

    create table tmp_table as
    select 
      ID, 
      time, 
      row_number() over (partition by ID order by time desc) as time_rank
    from table_name;
    
    select ID, time
    from tmp_table
    where time_rank = 1
    group by ID, time;
    
    drop table tmp_table;
    

    【讨论】:

    • 我正在使用不支持子查询的低版本配置单元,还有其他选择吗?
    • 嗯,一种选择是为子查询生成的数据创建临时表,然后从中选择。
    • 你能建议我这样做吗
    • @Ganesh 我添加了不使用子查询的查询。
    • 我试过你的查询,我得到 ok failed: parseexception line 5:20 missing from at '(' near '(' in subquery source line 5:21 cannot identify input near 'partition子查询源中的''by''id'我使用的是hive 0.10.0版本
    【解决方案2】:

    使用简单的聚合:

    select  id, max(time) as time
      from table
    group by id
    order by id; --order if necessary
    

    使用您的数据集进行演示:

    select id, max(time) as time 
    from
    table
    group by id
    
    OK
    10038446        201706060100
    10103517        201706060100
    10124464        201706060100
    Time taken: 30.66 seconds, Fetched: 3 row(s)
    

    【讨论】:

    • 我之前也试过了,没有给出预期的结果,而是给出了完整的结果
    • 我转换为 max(CAST(r.nominaltime as BIGINT)),但结果相同
    • 我目前正在使用不支持子查询的 hive 0.10.0 - 如果我错了请纠正我
    • 你不需要它,因为你有数据表。只需将 s 子查询替换为您的表,就像我之前的查询中一样
    猜你喜欢
    • 2012-04-12
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 2023-02-05
    相关资源
    最近更新 更多