Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于统计的cassandra数据点提取_Cassandra_Time Series_Cassandra 2.0_Cql3 - Fatal编程技术网

基于统计的cassandra数据点提取

基于统计的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

我正在测试卡桑德拉2.0作为存储时间序列数据的替代品

我制作了一个简单的表格,并将我们的一些数据转储到其中:

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分钟前很有趣,我以前没注意到。我想这是一个缺陷或限制。那么你可能不得不尝试我提到的其他方法。