我有一个事件表,该表与所有者(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(分钟)。
我计划最终依靠某种机器学习代码,在该代码中,我可以在宽限期后向其提供事件,但是距离这一点还很遥远,所以我正在寻找临时解决方法。
>答案 0 :(得分:0)
您可以尝试使用用户定义的聚合函数,例如described in documentation。我认为您几乎可以重用此处显示的功能,仅更改状态初始化的代码。您需要在enable_user_defined_functions
文件中将cassandra.yaml
更改为true。
要获得良好的性能,您需要确保仅在单个分区内执行聚合。您可以查看this blog post以获得更多示例和最佳做法。