为 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);
这里 date
是 MM/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! 读一读它应该可以帮助您解决这些类型的问题。
我的应用程序想要以降序显示一天上传的照片。
我查看了 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);
这里 date
是 MM/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! 读一读它应该可以帮助您解决这些类型的问题。