如何在Hive查询中使用row_number来获取最新的用户登录信息?

时间:2018-06-08 20:27:08

标签: hive hiveql

我的查询运行正常

日志表如下所示

JsonViewResponseBodyAdvice

public final Object beforeBodyWrite(@Nullable Object body,
    MethodParameter returnType, ..., ..., ..., ...) {

    //...

    MappingJacksonValue container = getOrCreateContainer(body);

    //...

    return container;
}

结果将是这样的

reportid, timestamp, userid

但是,我希望结果只是

SELECT
  reportid,
  b.email
FROM
  logs
  JOIN mongo.user b on a.userid = b.id
WHERE
  a.dt >= date_sub(current_date, 14)
GROUP BY
  reportid,
  b.email

这仅基于时间戳。我了解了reportid, email 1, xxx@xxx.com 1, xxx1@xxx.com 但是当我添加了这个

reportid, email 1, xxx1@xxx.com

我收到此错误

  

编译语句时出错:FAILED:SemanticException无法分解窗口调用到组中。至少有一个组必须仅依赖于输入列。还要检查循环依赖性。基础错误:org.apache.hadoop.hive.ql.parse.SemanticException:第7:34行表达式不在GROUP BY键' userid'

我只想根据时间戳

访问最新报告的用户ID

1 个答案:

答案 0 :(得分:1)

如果您正在查找访问该报告的最新用户ID,请按时间戳降序对记录进行排序,并使用limit获取第一行

select userid, b.email
from  logs a
join mongo.user b on a.userid = b.id
where  a.dt >= date_sub(current_date, 14)
sort by timestamp desc 
limit 1

如果您希望获取用户列表及其访问报告的最新时间戳,那么您需要为row_number()列指定一个名称,并使用它来为每个用户ID组获取1行。

select userid,email
from
(
    select userid, b.email, row_number() over (partition by userid order by timestamp desc) as r_no
    from  logs a
    join mongo.user b on a.userid = b.id
    where  a.dt >= date_sub(current_date, 14)
) t
where t.r_no=1