选择Hive中表中的第一个匹配项

时间:2014-01-29 15:09:38

标签: sql hadoop hive

我在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;

但是我想知道如果没有连接(或自定义缩减器)我是否可以这样做,因为它很耗时。

编辑:澄清:我想要实现的目标是id所做的第一个操作(与action对应的min(msts))。

2 个答案:

答案 0 :(得分:3)

在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;

答案 1 :(得分:0)

如果您需要显示操作字段,则无法在不加入的情况下执行此操作。 如果您不需要操作字段,请尝试以下操作:

    select id, min(msts) as msts
from A group by id;