基于区间和事件的时间序列的Cassandra数据模型

时间:2017-03-27 09:10:49

标签: cassandra time-series data-modeling

我必须从各种物联网传感器收集时间序列数据。根据我的研究,有两种不同类型的时间序列数据流。

案例1:固定间隔

这种类型的数据流具有固定的间隔,并且很容易在给定范围之间选择数据点。典型的用例是计数器

Interval based stream

案例2:基于事件

这种类型的数据流来自不规则的时间点,只有在某些事情即将发生变化时才会发生。当传感器离线或在线时,典型的用例是电源开关

Event based stream

要求

在给定时间窗口之间选择所有受影响的数据点

数据模型

这是我的cassandra数据模型。

可以对流中的任何点进行建模
CREATE TABLE sensor_raw (
  sensor_id    text,
  bucket_id    date,
  sensor_time  timestamp,
  sensor_value  double,
  PRIMARY KEY ((sensor_id, bucket_id), sensor_time )
) WITH CLUSTERING ORDER BY (sensor_time DESC);

案例1的解决方案

这非常简单,无需进一步讨论

SELECT * FROM sensor_raw where 
sensor_id = '1' AND
bucket_id = '2017' AND 
sensor_time >= '2017-01-01 10:00' 
AND sensor_time < '2017-01-01 10:14'

案例2的解决方案

这里我遇到的问题是窗外的事件可能会重叠到所选范围内。例如 E1

另一个问题是事件尚未完成的最后一个事件 E3

我需要

  1. 开始窗口 E1 的部分持续时间。

    要获得此信息,我必须回顾流中的第一个事件以获取上一个事件。然后计算从窗口开始到E2的差异。

  2. E2 E3 的持续时间

    这很简单

  3. E2 窗口结束的持续时间<尚未完成

    必须检查上一个事件是否与窗口结束具有相同的时间戳,如果不是最后一个事件仍然在运行。

  4. 结果

    Wanted result

    问题

    案例2有更好的数据模型吗?

    有没有办法没有额外的查询来获得我需要的解决方案?

1 个答案:

答案 0 :(得分:1)

我认为你几乎涵盖了所有场景。可以帮助您的一件事是,如果您可以创建一个事件表,其中数据与&#34;事件&#34; type和end_time会去。有点像:

CREATE TABLE sensor_raw_events (
  sensor_id         text,
  bucket_id         date,
  event_end_time    timestamp,
  event_begin_time  timestamp,
  event_type        text,
  PRIMARY KEY ((sensor_id, bucket_id), sensor_end_time )
) WITH CLUSTERING ORDER BY (sensor_end_time DESC);

这样做的先决条件是你实际上有某种层可以跟踪在应用程序级别上切换的事件。由于协议要求,我工作的项目在连接设备时必须保持会话,所以这不是一个真正的问题。

我们基本上只有很小的内存网格,可以保持每个传感器的当前状态定期刷新到cassandra - 这只是为了恢复所有应用程序都会崩溃,但这种情况从未发生过。

这种方法可能需要大量内存资源来运行它,所以如果你有数百万个传感器,这可能会变得太昂贵而且它不会增加很多价值,所以基本上这一切都取决于你实际拥有的规模

另外一个想法的缺点是,你不会真正抓住当前正在进行的事件,因为它尚未写入表中。但实际上是o.k.对于分析工作负载,因为你不必进行额外的查询来获取E1的开头,它就已经存在了。

使用带有begin_time和end_time的一个表的一些方法也可能是可能的,但是这又会浪费空间(并且传感器可以快速打包)。

你的模型和你描述它的方式与我以前做过的东西非常相似,而单独使用cassandra就没有我知道你可以做的更多:(