我是关于cassandra数据建模的新手,我真的需要同样的建议,这是我的问题:
我需要创建一个新的列系列,允许我存储和检索最后插入的分数:
CREATE TABLE average_score(
audit_time timestamp PRIMARY KEY,
pages_count int,
score float,
)
插入的数据不是根据主键排序的(我使用随机的partinioner(默认)),你有什么解决方案吗?我可以为此系列列指定不同的分区程序吗?
感谢
答案 0 :(得分:2)
以下是一个小时分区系列表的示例,可能会为您澄清一些事项:
CREATE TABLE average_score(
hour timestamp,
audit_time timeuuid,
pages_count int,
score float,
PRIMARY KEY (hour, audit_time)
)
WITH CLUSTERING ORDER BY (audit_time DESC)
因为它是第一个,hour
是我们的“分区”键,即它将用于在整个群集中物理分布我们的数据。 (当你写作时,你必须提供这个值,向下舍入到当前小时的开始。)
audit_time
是我们的第一个“群集”密钥,即它用于排序和识别特定节点上给定hour
分区中的行。我们选择了timeuuid
来防止覆盖。 (您可以使用dateOf
功能提取实际时间。请参阅http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/timeuuid_functions_r.html)
WITH CLUSTERING ORDER BY (audit_time DESC)
指示C *在磁盘上按降序存储分区内的行,如果您打算在大多数查询中使用ORDER BY audit_time DESC
,这可能是正确的决定。 (见http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/refClstrOrdr.html)
警告:虽然我们已经相当精细地对数据进行了分区,但如果您只是在注册时添加新分数,那么您仍然会有一些写入热点。
干杯!
P.S。如果您仍然困难,DataStax CQL文档是数据建模帮助的绝佳资源。
答案 1 :(得分:0)
您可以使用时间戳作为列名,在一行中存储所有(理论上,实际上您可能会选择一些最大列数)值。 通过这样做,您可以通过遍历列来按时间顺序遍历数据。
永远记住:cassandra中的主键不是用于对群集节点之间的分区进行排序。
有关详细信息,另请参阅http://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/。
答案 2 :(得分:0)
您可以使用Ordered partitioner,但不建议这样做。
替代解决方案
如果得分是针对实体(用户),则使用实体和日期(时间戳的日期部分)组合作为行键,即分区键。
列名称为时间戳(Cassandra中的TimeUUID),其值为分数。在创建列族时,使用" reversed = True"因为你需要最近的参赛作品。
然后,您可以进行切片查询以获得所需的结果