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

Posted

技术标签:

【中文标题】如何在 Hive 查询中使用 row_number 来获取最新的用户登录?【英文标题】:How do I use row_number in Hive query to get the latest user login? 【发布时间】:2018-06-08 20:27:08 【问题描述】:

我有这个运行良好的查询

日志表是这样的

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

这只是基于时间戳。我了解了row_number,但是当我添加了这个

row_number() over (partition by userid order by timestamp desc)

我收到此错误

编译语句时出错:FAILED: SemanticException 无法将窗口调用分解为组。至少 1 个组必须仅依赖于输入列。还要检查循环依赖。潜在错误:org.apache.hadoop.hive.ql.parse.SemanticException: Line 7:34 Expression not in GROUP BY key 'userid'

我只想要根据时间戳最新访问报告的用户 ID

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何在 Hive 查询中使用 row_number 来获取最新的用户登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在此查询中使用 ROW_NUMBER? [关闭]

用python 实现 hive sql join和row_number

如何在 Hibernate 中使用 row_number 函数编写查询?

如何在 Access 查询中显示行号,如 SQL 中的 ROW_NUMBER

mysql 怎么才能做到rownumber序号

Hive ROW_NUMBER TopN 性能优化