我必须从各种物联网传感器收集时间序列数据。根据我的研究,有两种不同类型的时间序列数据流。
案例1:固定间隔
这种类型的数据流具有固定的间隔,并且很容易在给定范围之间选择数据点。典型的用例是计数器。
案例2:基于事件
这种类型的数据流来自不规则的时间点,只有在某些事情即将发生变化时才会发生。当传感器离线或在线时,典型的用例是电源开关。
要求
在给定时间窗口之间选择所有受影响的数据点
数据模型
这是我的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 。
我需要
答案 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就没有我知道你可以做的更多:(