2

我是 Cassandra 的新手,我正在尝试为时间序列数据制作模型。我目前的提议是这样的:

CREATE TABLE myproject.variables (
nearest_10_minutes timestamp,
variable_type text,
value double,
variable_timestamp timestamp, 
PRIMARY KEY((variable_type, nearest_10_minutes), variable_timestamp)
)
WITH CLUSTERING ORDER BY (variable_timestamp ASC);

是感应到的variable_timestamp实际时间。valuenearest_10_minutes是时间戳,但四舍五入到最接近的 10 分钟。例如,如果 variable_timestamp 是:19/11/2013 13:13:19.562,则最近的_10_minutes 是19/11/2013 13:10:00.000

我可以摆脱集群键中的 variable_type 并将其放入二级索引,但我不确定这是否有助于我的情况。

问题是我不确定如何正确排序数据。如果我采取select * from myproject.variables(仅用于测试目的),我会得到类似(仅显示时间戳):

Tue Nov 19 13:19:52 CET 2013
Tue Nov 19 13:19:55 CET 2013
Tue Nov 19 13:40:04 CET 2013
Tue Nov 19 13:40:14 CET 2013
Tue Nov 19 13:40:29 CET 2013
...
Tue Nov 19 13:49:58 CET 2013
Tue Nov 19 13:49:59 CET 2013
...
Tue Nov 19 14:30:00 CET 2013
Tue Nov 19 14:30:01 CET 2013

现在,我不太清楚我是否应该得到一些默认排序?如果我使用 a,select * from myproject.variables order by variable_timestamp asc那么我会收到一条错误消息,指出如果分区键是用 EQ 或 IN 过滤的,我只能使用 ORDER BY。而且 IN 只能与分区键的第二部分一起使用,而不能与第一部分一起使用。

总而言之,我有点困惑,我怎样才能以我可以选择和排序数据的方式对此进行建模?

- - - - - - - - - - - - - - - 回答: - - - - - - - - - ------------------

因此,在某种程度上,jorgebg 和 BryceAtNetwork23 的所有当前答案以及 Mikhail Stepura 的评论都向我展示了我认为正确的道路。因为我想尽可能地保持分区随机,但我可以预测它,所以我可以排序查询并使用 IN 关键字(所以我可以在查询中放置多个分区键),我只是决定做一个自定义分区键。我选择的方案是连接 variable_type:timestamp_rounded_by_the_hour。我知道,这会引入一些存储逻辑的客户端泄漏,但是在代码中查询时重新创建分区键集相当容易。

我选择的答案是贡献最大的答案。

4

2 回答 2

2

聚类顺序影响行在同一分区键中的存储(和检索)方式,而不是列族中所有行的存储(分区)方式。

在您的情况下,从以下查询中检索到的行将按以下顺序排序variable_timestamp

SELECT * FROM variables WHERE variable_type = ? AND nearest_10_minutes = ?;

但是,如果您检索多个分区键:

SELECT * FROM variables;

它将按分区键(分区键的生成令牌)排序,然后按集群键排序。

您可以在博文 CQL3 for Cassandra 专家中了解行和列是如何存储和分区的。

于 2014-03-05T14:18:29.850 回答
2
PRIMARY KEY((variable_type, nearest_10_minutes), variable_timestamp)

PRIMARY/Partitioning key 的最佳值是唯一的。有多独特variable_type?仅根据您在此处所说的内容(没有真正了解您的数据),听起来value可能会成为更好的候选人。

WITH CLUSTERING ORDER BY (variable_timestamp ASC);

“现在,我不太清楚我是否应该得到一些默认订单?”

除非我错过了什么,否则您的数据似乎是按升序返回的。查看 DataStax 关于聚类顺序的文档。通过您现在定义 PRIMARY KEY 的方式,它将强制执行集群顺序variable_timestamp,升序。您只需要指定CLUSTERING ORDER是否需要反转该顺序。请注意,您的集群键表示数据在磁盘上的存储顺序。

“我收到一条错误消息,指出如果分区键使用 EQ 或 IN 过滤,我只能使用 ORDER BY。”

对,因为 CQL 不会让您在 WHERE 或 ORDER BY 中指定任何列。如果您想对集群键(在 ORDER BY 或 WHERE 中)做任何事情,您还需要指定分区键(在这种情况下,在 WHERE 子句中)。

尝试像这样创建您的主键:

PRIMARY KEY(value, variable_timestamp)

或者,如果在评估您的模型之后variable_type仍然有意义:

PRIMARY KEY(variable_type, variable_timestamp)

并且不要添加CLUSTERING ORDER子句。

有关建模时间序列数据的更多帮助,请查看DataStax Academy的(免费)课程“使用 Apache Cassandra 进行 Java 开发”。第 5 节,模块 104 讨论了对简单时间序列的建模。看看是否有帮助。

于 2014-03-05T15:16:04.060 回答