表格是:
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/