【问题标题】:Is it possible to get the average time between a range of timestamps in Cassandra?是否可以在 Cassandra 中获得一系列时间戳之间的平均时间?
【发布时间】:2019-02-04 23:58:19
【问题描述】:

我有一个事件表,其中存储了事件名称和所有者的时间 (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(分钟)。

我计划最终依赖某种机器学习代码,我可以在宽限期后为其提供事件,但我还没有接近那个点,所以我正在寻找一个临时的解决方法。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      相关资源
      最近更新 更多