iam*_*cle 8 cassandra composite-primary-key cassandra-2.0
我在Cassandra 2.0.9中定义了下表:
CREATE TABLE history
(
histid uuid,
ddate text, -- Day Date, i.e. 2014-11-20
valtime timestamp, -- value time
val text, --value
PRIMARY KEY ((histid , ddate), valtime )
)
WITH CLUSTERING ORDER BY (valtime desc)
;
Run Code Online (Sandbox Code Playgroud)
脚本每天在此表中插入几千行。
我需要能够从该表中选择仅知道组别的信息。但是,我已经使用(histid,ddate)对行进行了分区。意思是,我每行都有一整天的历史记录值。
为了从该表中选择特定的组别,我还需要提供ddate列。例如:
SELECT * FROM history
WHERE histid= cebc4c80-daa6-11e3-bcc2-005056a975a4
AND ddate = '2014-05-16'
;
Run Code Online (Sandbox Code Playgroud)
要获取最新值,我可以执行以下操作:
SELECT * FROM history
WHERE histid= cebc4c80-daa6-11e3-bcc2-005056a975a4
AND ddate = '2014-05-16'
LIMIT 1
;
Run Code Online (Sandbox Code Playgroud)
但是,如果我要获取任何给定的组织ID的最新值,我将不知道ddate是什么就提交查询,因为它是分区键的一部分。
所以...我问,解决这个问题的最佳方法是什么?
这是我所做的,但是我不知道;这是否合理:
我创建了一个辅助表:
CREATE TABLE history_date
(
histid uuid,
maxdate timestamp, -- most recent date
PRIMARY KEY (histid)
);
Run Code Online (Sandbox Code Playgroud)
当将一行插入到历史记录表中时,也会使用(histid,valtime)将一行插入该表中。
然后,我们的程序代码可以:
1. query the history_date table for a particular id
2. take the "maxdate" column (truncate it to yyyy-mm-dd)
3. use the histid and truncated maxdate to query the history table to retrieve the most recent value.
Run Code Online (Sandbox Code Playgroud)
所以这可行。但是,这确实不是一个好的解决方案。
是否有更好的方法可以做到这一点,也许只有一个表?
谢谢你的时间。
小智 0
好吧,正如您所提到的,您不能只知道用两个键分区的表的一个值来进行选择。但是,集群排序和排序依据限制选项可能会有所帮助,您已经使用过这些选项。
http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/refClstrOrdr.html
https://cassandra.apache.org/doc/cql3/CQL.html#selectStmt
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |