Cassandra架构设计按时间排序

时间:2014-09-19 14:11:58

标签: cassandra schema-design

我是关于cassandra数据建模的新手,我真的需要同样的建议,这是我的问题:

我需要创建一个新的列系列,允许我存储和检索最后插入的分数:

CREATE TABLE average_score(
    audit_time timestamp PRIMARY KEY,
    pages_count int,
    score float,
)

插入的数据不是根据主键排序的(我使用随机的partinioner(默认)),你有什么解决方案吗?我可以为此系列列指定不同的分区程序吗?

感谢

3 个答案:

答案 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)

警告:虽然我们已经相当精细地对数据进行了分区,但如果您只是在注册时添加新分数,那么您仍然会有一些写入热点。

干杯!

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"因为你需要最近的参赛作品。

然后,您可以进行切片查询以获得所需的结果