【发布时间】:2016-01-25 15:45:59
【问题描述】:
我们有一个包含大量时间序列数据的表。可能我们必须在该表中每毫秒存储几个条目。为了满足这些要求,表格看起来像
CREATE TABLE statistic (
name text,
id uuid,
start timestamp,
other_data ...,
PRIMARY KEY (name, start, id)
) WITH CLUSTERING ORDER BY (start DESC);
如您所见,该表由两个聚类键组成,start 存储数据到达的时间,id 的目的是避免数据同时到达时被覆盖。
现在可以了,我们可以像这样进行范围查询
SELECT * FROM statistic WHERE name ='foo' AND start >= 1453730078182
AND start <= 1453730078251;
但我们还需要能够在查询中添加额外的搜索参数,例如
SELECT * FROM statistic WHERE name = 'foo'
AND start >= 1453730078182 AND start <= 1453730078251 AND other_data = 'bar';
这当然行不通,因为other_data 不是主键的一部分。如果我们将它添加到主键,我们会得到以下错误
InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY 列 "other_data" 不能被限制(前面的列 "start" 受非 EQ 关系限制)"
没关系,这不是Cassandra 的工作方式(我认为)。
我们解决问题的方法是使用上述(第一个)范围查询选择所需的(时间序列)数据,然后在我们的 Java 应用程序中过滤数据。这意味着我们遍历列表并剔除 Java 应用程序中不需要的所有数据。一个条目没有太多数据,但在最坏的情况下,我们可能会讨论数百万行。
现在我有两个问题:
- 这是解决问题的正确方法吗?
- Cassandra 是否能够处理这么多数据?
【问题讨论】:
-
您是否在 YouTube 上看到过有关他们如何使用 Cassandra 实现时间序列数据库的演讲? UBS Securities: A Journey with Cassandra at UBS Securities。它可能包含一些好主意。
-
感谢您的链接。只要有时间,我就会观看该视频。