我是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。我知道,这会引入一些客户端泄漏存储逻辑,但在代码中重新创建查询分区键非常容易。
我选择的答案是贡献最多的答案。
答案 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讨论了对简单时间序列建模。看看是否有帮助。