使用Spark / Cassandra的时间序列 - 如何在值满足条件时查找时间戳?

时间:2016-09-19 09:58:25

标签: apache-spark cassandra time-series

我有时间序列存储在Cassandra表中,来自几个传感器。这是我用于存储数据的模式:

CREATE TABLE data_sensors (
    sensor_id int,
    time timestamp,
    value float,
    PRIMARY KEY ((sensor_id), time)
);

值可以是温度或压力,例如,取决于传感器的来源。

我的目标是能够找到压力的基本统计数据(min,max,avg,std),但仅限于温度高于某个值时。 这是我想要的整个过程的模式。 schema of the process described before

我认为如果我改变Cassandra模型(至少对于温度数据)能够过滤价值可能会更好。将数据导入Spark RDD之后是否有另一种方法可以避免改变Cassandra表?

然后,一旦完成温度过滤,如何获得我必须用来过滤压力数据的时间戳序列?请注意,我没有必要的温度和压力时间戳,这就是为什么我认为我需要有一段时间而不是精确时间戳列表。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这不是Cassandra特有的答案,但也许你想看一下在NoSQL商店之上提供SQL层的时间序列数据库,并支持JOIN和聚合。

以下是支持期间聚合和连接的ATSD SQL语法示例。

SELECT t1.entity, t1.datetime, min(t1.value), max(t1.value), avg(t2.value)
  FROM mpstat.cpu_busy t1
  JOIN meminfo.memfree t2 
 WHERE t1.datetime >= '2016-09-20T15:00:00Z' AND t1.datetime < '2016-09-20T15:15:00Z'
  GROUP BY entity, t1.PERIOD(1 MINUTE)
  HAVING max(t1.value) > 30

查询加入两个指标,过滤掉第一个指标低于阈值的1分钟行,然后返回第二个系列的一堆统计数据。

如果两个系列的间距不均匀,则可以使用linear interpolation对阵列进行规范化。

披露:我为开发ATSD的Axibase工作。