为 cassandra 设计时间序列模式

Design timeseries schema for cassandra

我的应用程序想要以降序显示一天上传的照片。

我查看了 cassandra 的气象站示例,我从中获取了特定气象站的时间序列数据。就我而言,我想跟踪系统中存在的所有照片。我设计了如下架构:

create table if not exists photos(
photo_id uuid,
category text,
owner uuid,
date text,
created timestamp,
primary key((date),created)
)WITH CLUSTERING ORDER BY (created DESC);

这里 dateMM/DD/YYYY 字符串表示 created 日期。

这里的问题是当我 select 我想要基于 created 日期的最新照片。我以随机顺序返回行(如果它们具有相同的日期,它们将按降序排列)。我想在 select.

时获取最新日期的行

请尝试在select操作中使用“Order by”。它将根据日期

带来数据

Below example shows the value of photos based-on created date in ascending order.

cqlsh:temp> SELECT * FROM photos WHERE created in (1427524795784,1427524795899) and date = 'march-28'  ORDER BY created ASC ;


 date     | created                  | category | owner                                | photo_id
----------+--------------------------+----------+--------------------------------------+--------------------------------------

 march-28 | 2015-03-28 10:39:55+0400 |   nature | 007aa9b5-c86b-4805-a65d-6019d1ba820b | 007aa9b5-c86b-4805-a65d-6019d1ba820b
 march-28 | 2015-03-28 10:39:55+0400 |   nature | 007aa9b5-c86b-4805-a65d-6019d1ba820b | 007aa9b5-c86b-4805-a65d-6019d1ba820b

The problem here is when I do select I want latest photo based on created date. I get back rows in random order

实际上,它们是按照您的分区键 (date) 的散列值排序的。 Cassandra 只能在 一个分区键内维护集群顺序 。这就是为什么具有相同 created 的行被排序为 "if they have the same date."

I want to fetch rows for latest date when I do select.

可以做到这一点。您需要做的就是指定一个日期。

SELECT * FROM photos WHERE date='03/28/2015';

通过限制您的分区键,您的行将按照定义的聚类顺序返回。从您的应用程序或报告级别来看,生成当前日期应该不会太难。

另外,不是为了自我推销,而是本月早些时候 Planet Cassandra 发表了一篇我写的关于这个主题的文章(主要基于我在这个网站上回答的问题):We Shall Have Order! 读一读它应该可以帮助您解决这些类型的问题。