sql - hive sql查找最新记录

标签 sql group-by hive max

表格是:

create table test (
id string,
name string,
age string,
modified string)

数据如下:

id    name   age  modifed
1     a      10   2011-11-11 11:11:11
1     a      11   2012-11-11 12:00:00
2     b      20   2012-12-10 10:11:12
2     b      20   2012-12-10 10:11:12
2     b      20   2012-12-12 10:11:12
2     b      20   2012-12-15 10:11:12

我想获取最新的记录(包括每列id,name,age,modifed)按id分组,如上面的数据,正确的结果是:

1     a      11   2012-11-11 12:00:00
2     b      20   2012-12-15 10:11:12

我确实喜欢这样:

insert overwrite table t 
select b.id, b.name, b.age, b.modified 
from (
        select id,max(modified) as modified 
        from test 
        group by id
) a 
left outer join test b on (a.id=b.id  and a.modified=b.modified);

这条sql可以得到正确的结果,但是当数据量很大时,运行速度很慢。

**有没有办法在没有左外连接的情况下做到这一点? **

最佳答案

Hive SQL 有一个几乎没有记录的功能(我在他们的一份 Jira bug 报告中发现了它),它允许您使用 struct() 执行诸如 argmax() 之类的操作。例如,如果您有一个如下表:

test_argmax
id,val,key
1,1,A
1,2,B
1,3,C
1,2,D
2,1,E
2,1,U
2,2,V
2,3,W
2,2,X
2,1,Y

你可以这样做:

select 
  max(struct(val, key, id)).col1 as max_val,
  max(struct(val, key, id)).col2 as max_key,
  max(struct(val, key, id)).col3 as max_id
from test_argmax
group by id

并得到结果:

max_val,max_key,max_id
3,C,1
3,W,2

我认为,如果 val (第一个结构元素)存在联系,它将回退到第二列上的比较。我还没有弄清楚是否有更简洁的语法可以将各个列从结果结构中取出,也许可以使用named_struct 某种方式?

关于sql - hive sql查找最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523049/

相关文章:

mysql - 如何根据时间戳和 bool 值查询记录?

JSON 数据的 JavaScript SUM 和 GROUP BY

sql - Hive 支持 Join 条件下的子查询?

sql - 仅将更新的记录从 SQL 导入到 Hive

mysql - SQL 查询错误 - 从带条件的表中选择

php - 导入 sql 文件时出现内部服务器错误?

sql - 未获取查询中的所有记录

mysql - 对行进行分组并对每个组进行排序

mysql - 如何在 mysql 非常大的表中更快地分组?

hadoop - 将带有 .tsv 文件的 HDFS 目录映射到 Hive