cassandra中每列的总和

时间:2017-12-08 08:02:15

标签: cassandra cassandra-3.0

我有一个如下所示的数据模型,

CREATE TABLE appstat.nodedata (
    nodeip text,
    timestamp timestamp,
    flashmode text,
    physicalusage int,
    readbw int,
    readiops int,
    totalcapacity int,
    writebw int,
    writeiops int,
    writelatency int,
    PRIMARY KEY (nodeip, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)

其中,nodeip - 主键和时间戳 - 聚类键(通过descinding oder排序以获取最新的),

此表格中的示例数据

SELECT * from nodedata WHERE nodeip = '172.30.56.60' LIMIT 2;

 nodeip       | timestamp                       | flashmode | physicalusage | readbw | readiops | totalcapacity | writebw | writeiops | writelatency
--------------+---------------------------------+-----------+---------------+--------+----------+---------------+---------+-----------+--------------
 172.30.56.60 | 2017-12-08 06:13:07.161000+0000 |       yes |            34 |     57 |       19 |            27 |       8 |        89 |           57
 172.30.56.60 | 2017-12-08 06:12:07.161000+0000 |       yes |            70 |      6 |       43 |            88 |      79 |        83 |           89

这是正确可用的,每当我需要获取统计数据时,我都可以使用下面的分区键获取数据,

(以上逻辑与我之前的问题类似:Aggregation in Cassandra across partitions但期望不同

我对所有4个节点中每隔一分钟填充的每列(如readbw,延迟等)都有价值。

现在,如果我需要获取列的最大值(例如:readbw),可以使用以下查询,

SELECT max(readbw) FROM nodedata WHERE nodeip IN ('172.30.56.60','172.30.56.61','172.30.56.60','172.30.56.63') AND timestamp < 1512652272989 AND timestamp > 1512537899000;

1)第一个问题:有没有办法在不使用IN查询的情况下在列的所有节点(readbw)上执行 max 聚合?

2)第二个问题:每当我在节点1,节点2,节点3和节点4中插入数据时,在Cassandra中是否有办法。 它需要聚合并存储在另一个表中。这样我将从聚合表中收集每列的聚合值。

如果我的观点不明确,请告诉我。

谢谢,
哈利

2 个答案:

答案 0 :(得分:1)

如果你是Cassandra,你可以启用spark并编写聚合查询

答案 1 :(得分:-1)

声明。在您的问题中,您应该定义查询速度的限制。读者不知道您是否试图实时显示,或者更多是出于分析目的。它还不清楚你操作了多少数据,答案可能取决于它。

首先决定是否要在读取或写入时进行聚合。这在很大程度上取决于您的读/写模式。

1)第一个问题:(读取时聚合) 简短的回答是否定的 - 这是不可能的。如果您想使用Cassandra,最好的方法是通过读取每个带有时间戳限制的nodeip来在您的应用程序中进行聚合。那会很慢。但Cassandra聚合也可能很慢。此警告存在的原因如下:

Warnings :
Aggregation query used without partition key

我发现C ++ Cassandra驱动程序是最快的选择,如果你进入那个。

如果您的数据大小允许,我会考虑使用其他数据库。除非你有数TB的数据,否则普通的旧MySQL或Postgres都可以正常工作。如果你想要一个更具异国情调的人,那么你也会涌入数据库。但我在这里偏离主题。

2)第二个问题:(写入时聚合) 这是我一段时间以来一直在使用的方法。每当我需要一些聚合时,我会在内存(redis)中执行它们,然后刷新到Cassandra。请记住,Cassandra在编写数据时非常有效,不要害怕为您的聚合创建一些额外的表。我无法确切地说明如何为您的数据执行此操作,因为这一切都取决于您的要求。在聚合写入时,为任意时间戳间隔提供结果似乎不可行。

不要试图将大量数据放入单个分区。那么你对传统的SQL数据库更好。