我在德鲁伊有一张桌子,类似
Timestamp || UserId || Action
我需要为每个UserId获取最新的操作。在MySQL中,我会做类似的事情
Select * from users u1 inner join (
select UserId, max(Timestamp) as maxt from users group by UserId
) u2
on u1.UserId = u2.UserId and u1.Timestamp = u2.maxt
但是Druid不能加入联接,只能进行非常基本的子选择。
我知道“正确”的答案可能是在摄取时对数据进行非规范化,但是不幸的是,由于我不“拥有”摄取部分,因此这不是一种选择。
到目前为止,我唯一想出的解决方案是用Java代码检索两个查询的所有结果并手动进行连接,但是当我想像的数据集增长时,我将遇到内存限制。
我试图查看实例化视图,但是看起来它仍在孵化中,并且需要一个hadoop集群,因此实际上并不可行。
我试图做类似的事情
Select * from users u1 where concat(Timestamp, UserId) in (
select concat(UserId, max(Timestamp)) from users group by UserId
)
但它也不喜欢。
有什么建议吗?
答案 0 :(得分:1)
最新(expr)
返回 expr
的最新值,必须是数字。如果expr
来自与时间戳列的关系(如德鲁伊
数据源)然后“最新”是最后遇到的值
聚合的所有值的最大整体时间戳。如果expr
不是来自与时间戳的关系,那么它只是
遇到的最后一个值。