Druid查询从第三列获取“最新”值

时间:2019-07-10 11:45:41

标签: druid apache-calcite

我在德鲁伊有一张桌子,类似

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
)

但它也不喜欢。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

<块引用>

最新(expr)

返回 expr 的最新值,必须是数字。如果expr 来自与时间戳列的关系(如德鲁伊 数据源)然后“最新”是最后遇到的值 聚合的所有值的最大整体时间戳。如果expr 不是来自与时间戳的关系,那么它只是 遇到的最后一个值。

https://druid.apache.org/docs/0.20.0/querying/sql.html