我在 hive 上有一个表 A,如下所示:
id msts action
123 1000 sleep
123 1010 eat
123 2001 sleep
456 1200 eat
456 1500 drink
我想要的是为每个 id
选择与 min(tmst)
对应的整个集合。我可以通过运行
select *
from A t1 semi
left join
(select id, min(msts) as msts from A group by id)
t2 on t1.id = t2.id and t1.msts = t2.msts;
但我想看看我是否可以在没有连接(或自定义 reducer )的情况下完成它,因为它很耗时。
编辑:澄清一下:我想要得到的是每个 id
执行的第一个操作(action
对应于 min(msts)
).
最佳答案
Hive 社区中有一些关于是否实现 argmin 和 argmax udfs 的反馈,这正是您在这里想要的。决议是不添加它,因为结构有一个解决方法。诀窍是结构首先按第一个字段进行比较,因此您可以先将字段转换为具有比较字段的结构,进行最小化,然后取消结构化字段。在这种情况下:
select s.id as id, s.msts as msts, s.action as action from (
select min(named_struct('msts', msts, 'id', id, 'action', action)) as s
from A group by id
) t;
关于sql - 选择 Hive 表中的第一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435011/