我有一个如下所示的数据模型,
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中是否有办法。 它需要聚合并存储在另一个表中。这样我将从聚合表中收集每列的聚合值。
如果我的观点不明确,请告诉我。
谢谢,
哈利
答案 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数据库更好。