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

Posted

技术标签:

【中文标题】使用 Spark/Cassandra 的时间序列 - 如何在值满足条件时找到时间戳?【英文标题】:Timeseries with Spark/Cassandra - How to find timestamps when values satisfy a condition? 【发布时间】:2016-09-19 09:58:24 【问题描述】:

我在 Cassandra 表中存储了来自多个传感器的时间序列。这是我用于存储数据的架构:

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

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

我的目标是能够找到压力的基本统计数据(最小值、最大值、平均值、标准),但前提是温度高于某个值。 这是我想要获得的整个过程的模式。

我认为如果我更改 Cassandra 模型(至少对于温度数据)能够过滤值会更好。在将数据导入 Spark RDD 之后,还有其他方法可以避免更改 Cassandra 表吗?

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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

这并不是 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 工作。

【讨论】:

以上是关于使用 Spark/Cassandra 的时间序列 - 如何在值满足条件时找到时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

Spark 1.3.x 的 org.apache.spark.sql.cassandra 的 API 文档在哪里?

EMR LinkageError 上的 Spark + Cassandra

使用Spark+Cassandra打造高性能数据分析平台

使用 Calliope 库的 Spark Cassandra 集成 - 不显示任何记录

Spark Cassandra 连接器 - where 子句

Spark Cassandra 使用区分大小写的名称写入 UDT 失败