基于统计的cassandra数据点提取
我正在测试卡桑德拉2.0作为存储时间序列数据的替代品 我制作了一个简单的表格,并将我们的一些数据转储到其中:基于统计的cassandra数据点提取,cassandra,time-series,cassandra-2.0,cql3,Cassandra,Time Series,Cassandra 2.0,Cql3,我正在测试卡桑德拉2.0作为存储时间序列数据的替代品 我制作了一个简单的表格,并将我们的一些数据转储到其中: CREATE TABLE DataRaw( channelId int, sampleTime timestamp, value double, PRIMARY KEY (channelId, sampleTime) ) WITH CLUSTERING ORDER BY (sampleTime ASC); 我可以很容易地执行最常用的查询,如first value、las
CREATE TABLE DataRaw(
channelId int,
sampleTime timestamp,
value double,
PRIMARY KEY (channelId, sampleTime)
) WITH CLUSTERING ORDER BY (sampleTime ASC);
我可以很容易地执行最常用的查询,如first value、last value current,并通过max、min、count、avg等获取统计信息
但是我不仅需要获取某个范围内的最大值,还需要获取该值所在的采样时间
对于给定数据:
sampleTime value
2015-08-28 00:00 10
2015-08-28 01:00 15
2015-08-28 02:00 13
我希望查询返回2015-08-28 01:00和15
我试过这样的方法:
select sampletime, value from dataraw where channelid=865 and sampletime >= '2014-01-01 00:00' and sampleTime < '2014-01-02 00:00' and value = (select max(value) from dataraw where channelid=865 and sampletime >= '2014-01-01 00:00' and sampleTime < '2014-01-02 00:00');
cqlsh:test> SELECT * from dataraw ;
channelid | sampletime | value
-----------+--------------------------+-------
1 | 2015-08-28 06:20:38-0400 | 10
1 | 2015-08-28 06:20:49-0400 | 15
1 | 2015-08-28 06:20:57-0400 | 13
cqlsh:test> SELECT sampletime, max(value) FROM dataraw
WHERE channelid=1 AND sampletime >= '2015-08-28 06:20:38-0400'
AND sampletime <= '2015-08-28 06:20:57-0400';
sampletime | system.max(value)
--------------------------+-------------------
2015-08-28 06:20:38-0400 | 15
这将在普通SQL中工作,但Cassandra不喜欢它
有什么想法吗?您可以在Cassandra 2.2中执行这种类型的查询。较旧的2.0分支已过时,查询选项少于2.2 在2.2中,它如下所示:
select sampletime, value from dataraw where channelid=865 and sampletime >= '2014-01-01 00:00' and sampleTime < '2014-01-02 00:00' and value = (select max(value) from dataraw where channelid=865 and sampletime >= '2014-01-01 00:00' and sampleTime < '2014-01-02 00:00');
cqlsh:test> SELECT * from dataraw ;
channelid | sampletime | value
-----------+--------------------------+-------
1 | 2015-08-28 06:20:38-0400 | 10
1 | 2015-08-28 06:20:49-0400 | 15
1 | 2015-08-28 06:20:57-0400 | 13
cqlsh:test> SELECT sampletime, max(value) FROM dataraw
WHERE channelid=1 AND sampletime >= '2015-08-28 06:20:38-0400'
AND sampletime <= '2015-08-28 06:20:57-0400';
sampletime | system.max(value)
--------------------------+-------------------
2015-08-28 06:20:38-0400 | 15
对于更多的背景知识,尽管CQL Cassandra查询语言看起来类似于SQL,但它对您可以执行的查询类型有很多限制。看
因此,您有几个选择:
将模式和查询设置为在CQL的限制范围内工作,有时依赖客户机中的代码对实际感兴趣的行的超集进行过滤/分析
您可以创建UDF的用户定义函数和用户定义聚合函数,以便在查询协调器上执行一些额外的工作,即使用集群内资源而不是客户机资源
您可以将Cassandra与ApacheSpark配对,ApacheSpark可以进行比CQL更复杂的分析,但设置和使用起来有些复杂
在Cassandra 3.0中,有一个称为物化视图的新功能,它允许您为数据定义一个备用主键,以支持数据集上不同于基表支持的查询模式。Cassandra 3.0目前处于测试版
Cassandra 2.2将最小、最大、平均和求和函数以及用户定义的函数添加到CQL中,因此比2.0更强大。我认为随着时间的推移,CQL将慢慢获得更多的SQL功能,但一些传统的SQL操作在分布式模型中很难实现,需要时间来实现。支持最小值时间和最大值时间聚合器
MIN_VALUE_TIME返回在时段内首次达到最小值时的时间(以毫秒为单位)。
MAX_VALUE_TIME返回在时段内首次达到最大值时的时间(以毫秒为单位)。
多个聚合器可以组合在同一个API请求中,因此您可以一次性获取最大值和最大值时间
至于后端,ATSD使用HBase进行原始存储
披露:我为Axibase工作
更新1:关于如何表示这些聚合器的示例。通常,您会分别显示时间戳以及最小值和最大值。这回答了最大值是多少以及何时达到的问题
更新2:SQL控制台
SELECT entity,
MAX(value),
date_format(MAX_VALUE_TIME(value), 'yyyy-MM-dd HH:mm:ss') AS "Max Value Time"
FROM cpu_busy
WHERE time > current_hour GROUP BY entity
一定是卡桑德拉。另一个支持这种聚合函数的NoSQL数据库会工作吗?尽管我现在正在评估Cassandra,但我愿意接受其他建议。似乎我正在测试Cassandra 2.2。虽然我下载了2.0,但不是apt更新到2.2,就是我根本看不到我在安装什么。提名ATSD。在应答模式下发布详细信息,包括屏幕截图和这些聚合器的描述。我尝试了上述方法,但即使是您的示例也显示它返回最大值,但不返回相应的sampletime。它选择与范围和最大值匹配的第一个采样时间Paaland 6分钟前很有趣,我以前没注意到。我想这是一个缺陷或限制。那么你可能不得不尝试我提到的其他方法。