假设您有一个简单的Cassandra架构(使用CQL3),它可以在每秒级别保存各种传感器的读数。 (时间序列)
create table sensor_readings (
sensorid varchar,
time timestamp,
value varchar,
primary key (sensorid, time)
)
是否有一种有效的方法来检索不同于记录的时间周期的数据?
例如,当每秒存储所有数据时,如何仅检索每小时数据或每日数据?
您是否必须将所有数据检索到您的应用程序中,然后让您的应用程序过滤掉数据?或者Cassandra可以为你做这件事吗?
答案 0 :(得分:0)
这不是你可以说cassandra的限制,它们现在没有日期功能就像任何RDBMS数据库一样,所以你可以 - 没有办法检索和过滤掉数据。
正如您所提到的,您已经检索了所有数据,然后使用java脚本或您必须使用的东西进行过滤。
答案 1 :(得分:0)
Cassandra不会代表您进行任何汇总。因此,如果您需要按特定时间粒度对数据进行分组,则需要在插入时将数据点压缩到适当大小的时间窗口桶中。在Cassandra中处理时间序列数据时,这是一种常见的模式。有关示例,请参阅this article。
或者,您可以在应用中的查询时进行汇总,但是您将从Cassandra中流式传输大量数据。如果您可以在插入时执行此操作,则很可能会降低整体IO负载。
答案 2 :(得分:0)
由于cassandra不支持此功能,因此您有两种不同的选择。您可以在最初持久化数据时在持久性进程之前计算聚合数据(并在以后保留此类实体)。或者第二个 - 在成功持久性之后,通常称为"按需"。
何时使用第一个以及何时使用第二个选项?
首先显然更难,需要更多资源。关键是如果你总是需要统计数据(聚合)以及它是你应用程序的关键点,你应该在这个过程中计算它们。如果汇总数据的使用率要低得多,您可以在用户要求时按需计算它们。
好吧,正如我在这里描述的问题,这两种方法看起来像RDBSM索引方法和NoSQL中通常缺少索引之间的经典差异。 RDBMS总是计算它们,但是对于某些性能损失和锁定的潜在问题。另一方面,一旦使用NoSQL,通常需要自己计算索引。
答案 3 :(得分:0)
经典的Cassandra方法是设计支持查询的其他表。 This is a concise paper describing the process.
因此,对于每小时数据,您会有另一个表格,如
create table sensors_by_hour (
hour text,
sensorid varchar,
value varchar,
primary key (hour, sensorid)
)
并且您将同时写入两个表,显然是第二个在小时级别切换时间戳。这将为您提供特定小时的传感器和值。
等