Cassandra 2.0中的有序模型

时间:2014-03-05 13:21:36

标签: database database-design nosql cassandra cassandra-2.0

我是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是感知value的实际时间。 nearest_10_minutes是时间戳,但四舍五入到最接近的10分钟。例如,如果variable_timestamp为:19/11/2013 13:13:19.562,则nearest_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

现在,如果我得到一些默认订单,我不是很清楚吗?如果我使用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。我知道,这会引入一些客户端泄漏存储逻辑,但在代码中重新创建查询分区键非常容易。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

SELECT * FROM variables;

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

您可以在博文CQL3 for Cassandra experts中查看行和列的存储和分区方式。

答案 1 :(得分:2)

PRIMARY KEY((variable_type, nearest_10_minutes), variable_timestamp)

PRIMARY / Partitioning键的最佳值是唯一的值。 variable_type有多独特?根据你在这里所说的内容(不知道你的数据),听起来value可能会成为更好的候选人。

WITH CLUSTERING ORDER BY (variable_timestamp ASC);

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

除非我遗漏了某些内容,否则您的数据似乎会按升序返回。查看有关clustering order的DataStax文档。通过现在定义PRIMARY KEY的方式,它将在variable_timestamp上强制执行聚类顺序,升序。如果您需要撤销该订单,则只需指定CLUSTERING ORDER即可。请注意,您的群集密钥指示数据在磁盘上的存储顺序。

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

是的,因为CQL不会让你在WHERE或ORDER BY中指定任何列。如果要对聚类键(在ORDER BY或WHERE中)执行任何操作,还需要指定分区键(在本例中为WHERE子句)。

尝试创建这样的PRIMARY KEY:

PRIMARY KEY(value, variable_timestamp)

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

PRIMARY KEY(variable_type, variable_timestamp)

不要添加CLUSTERING ORDER子句。

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