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子句中)
试着像这样创建主键: