是否有可能在Cassandra中获得一系列时间戳之间的平均时间?

时间:2019-01-19 23:48:30

标签: cassandra

我有一个事件表,该表与所有者(device_id)存储事件名称和时间。我想知道事件平均发生的时间。

我知道Cassandra支持AVG(),但我确定它不是针对此用例而设计的。

我玩弄计数器,但事实是它们不一致,只能在没有其他字段的表内使用,这使其难以正确实现,并且会造成混乱。

简单事件表:

CREATE TABLE tests.events(
  device_id TEXT,
  event_name TEXT,
  event_time TIMESTAMP,
  PRIMARY KEY(device_id, event_name)
)
WITH CLUSTERING ORDER BY (event_time DESC)
WITH default_time_to_live = 2592000; // 30 days

我当前的查询:

SELECT * FROM events WHERE device_id = "abcd" AND event_time >= '2019-01-01 00:00:00+0200' AND event_time <= '2019-01-02 00:00:00+0200' LIMIT 100 ALLOW FILTERING;

我从设备检索最近的100个事件。是否可以直接在Cassandra中返回事件之间的平均时间?

假设我有以下event_time:

2019-01-01 10:00:00
2019-01-01 11:00:00
2019-01-01 11:30:00

平均为45(分钟)。

我计划最终依靠某种机器学习代码,在该代码中,我可以在宽限期后向其提供事件,但是距离这一点还很遥远,所以我正在寻找临时解决方法。

>

1 个答案:

答案 0 :(得分:0)

您可以尝试使用用户定义的聚合函数,例如described in documentation。我认为您几乎可以重用此处显示的功能,仅更改状态初始化的代码。您需要在enable_user_defined_functions文件中将cassandra.yaml更改为true。

要获得良好的性能,您需要确保仅在单个分区内执行聚合。您可以查看this blog post以获得更多示例和最佳做法。