Database Cassandra 2.0中的有序模型

Database Cassandra 2.0中的有序模型,database,database-design,nosql,cassandra,cassandra-2.0,Database,Database Design,Nosql,Cassandra,Cassandra 2.0,我是卡桑德拉的新手,我正在尝试为时间序列数据建立一个模型。我目前的建议是: 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 CLUSTE

我是卡桑德拉的新手,我正在尝试为时间序列数据建立一个模型。我目前的建议是:

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);
变量\u timestamp
是感测到
值的实际时间。
最接近的10分钟
是时间戳,但四舍五入到最接近的10分钟。例如,如果变量时间戳为:
19/11/2013 13:13:19.562
,则最近的时间戳为
19/11/2013 13:10:00.000

我可以去掉cluster键中的变量_类型并将其放入二级索引中,但我不确定这是否有助于我的情况

问题是我真的不确定如何正确地排序数据。如果我从myproject.variables中选择一个
select*(仅用于测试目的),我会得到如下结果(仅显示时间戳):

现在,我不太清楚我是否应该得到一些默认的排序?如果我使用
select*from myproject.variables order by variable\u timestamp asc
,那么我会得到一个错误,说明我只能在分区键使用EQ或IN进行过滤时使用order by。IN只能与分区键的第二部分一起使用,而不能与第一部分一起使用

总而言之,我有点困惑,我怎样才能以一种我可以选择和排序数据的方式来建模呢

------------------------------答复:------------------------------------

在某种程度上,JoeBeg和BrycATNETWORK23的所有答案以及Mikhail Stepura的评论都向我展示了我认为正确的道路。因为我希望分区尽可能的随机,但是我可以预测它,这样我就可以对查询进行排序并使用in关键字(这样我就可以在查询中放置多个分区键),所以我决定创建一个自定义分区键。我选择的方案是连接变量类型:timestamp按小时取整。我知道,这会导致一些存储逻辑的客户端泄漏,但在代码中重新创建查询上的分区键集相当容易


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

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

在您的情况下,从以下查询中检索到的行将按
变量\u timestamp
排序:

SELECT * FROM variables WHERE variable_type = ? AND nearest_10_minutes = ?;
但如果检索多个分区键:

SELECT * FROM variables;
它将按分区键(分区键生成的令牌)排序,然后按集群键排序


您可以在博客文章中看到行和列的存储和分区方式。

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

在您的情况下,从以下查询中检索到的行将按
变量\u timestamp
排序:

SELECT * FROM variables WHERE variable_type = ? AND nearest_10_minutes = ?;
但如果检索多个分区键:

SELECT * FROM variables;
它将按分区键(分区键生成的令牌)排序,然后按集群键排序

您可以在博客文章中看到行和列是如何存储和分区的

主/分区键的最佳值是唯一的值。变量类型的唯一性如何?仅根据您在这里所说的内容(并不真正了解您的数据),听起来
value
可能是一个更好的候选人

WITH CLUSTERING ORDER BY (variable_timestamp ASC);
“现在,我不太清楚我是否应该获得一些默认顺序?”

除非我遗漏了什么,否则看起来您的数据是按升序返回的。查看有关的DataStax文档。按照现在定义主键的方式,它将在
变量\u timestamp
上强制执行集群顺序,升序。如果需要颠倒顺序,则只需指定
群集顺序
。请注意,群集键指示数据在磁盘上的存储顺序

“我收到一个错误,说明我只能在使用EQ或IN筛选分区键时使用ORDER BY。”

对,因为CQL不允许您在WHERE或ORDER BY中指定任何列。如果要使用集群键(按顺序BY或WHERE),还需要指定分区键(在本例中,在WHERE子句中)

尝试按如下方式创建主键:

PRIMARY KEY(value, variable_timestamp)
或者,如果在评估您的模型后
变量类型
仍然有意义:

PRIMARY KEY(variable_type, variable_timestamp)
不要添加
集群顺序
子句

要获得更多关于时间序列数据建模的帮助,请查看“使用ApacheCassandra进行Java开发”的免费课程。课程5,模块104讨论了对简单时间序列的建模。看看这是否有帮助

主/分区键的最佳值是唯一的值。变量类型的唯一性如何?仅根据您在这里所说的内容(并不真正了解您的数据),听起来
value
可能是一个更好的候选人

WITH CLUSTERING ORDER BY (variable_timestamp ASC);
“现在,我不太清楚我是否应该获得一些默认顺序?”

除非我遗漏了什么,否则看起来您的数据是按升序返回的。查看有关的DataStax文档。按照现在定义主键的方式,它将在
变量\u timestamp
上强制执行集群顺序,升序。如果需要颠倒顺序,则只需指定
群集顺序
。请注意,群集键指示数据在磁盘上的存储顺序

“我收到一个错误,说明我只能在使用EQ或IN筛选分区键时使用ORDER BY。”

对,因为CQL不允许您在WHERE或ORDER BY中指定任何列。如果要使用集群键(按顺序BY或WHERE),还需要指定分区键(在本例中,在WHERE子句中)

试着像这样创建主键: