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

标签 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;

但我想看看我是否可以在没有连接(或自定义 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/

相关文章:

asp.net - 如何计算复选框列表值?

RStudio 连接到远程 Hadoop 服务器

java - 具有 ArrayWritable 的 Hadoop MapReduce 链

python - 如何在 ipython notebook 中为 Hive 查询设置最大分区

c# - EntityFramework 6 AddOrUpdate 不适用于复合或复合主键

java - 如何修改列值? (日本公共(public)事务局)

sql - 在不创建表的情况下使用 json_populate_recordset?

hadoop - hadoop 中的数据包计数(使用 Mapreduce)

hive - 如何在hive中分隔列

hadoop - 使用hadoop配置配置单元