2016-09-19 25 views
0

我將時間序列存儲在Cassandra表中,來自多個傳感器。這裏是我用於存儲數據的模式:Spark/Cassandra的時間序列 - 當值滿足條件時如何找到時間戳?

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

值可以是溫度或壓力,例如,取決於它來自哪個傳感器。

我的目標是能夠找到有關壓力的基本統計數據(最小,最大,平均,標準),但只有當溫度高於某個值時。 這是我希望獲得的整個過程的模式。 schema of the process described before

我認爲如果我改變Cassandra模型,至少對於溫度數據,能夠過濾值,可能會更好。在將數據導入Spark RDD之後,還有其他方法來避免更改Cassandra表嗎?

然後,一旦完成對溫度的過濾,如何獲得必須使用的時間戳序列來過濾壓力數據?請注意,我不一定有相同的溫度和壓力時間戳,這就是爲什麼我認爲我需要一段時間而不是精確的時間戳列表。

感謝您的幫助!

回答

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工作。