Cassandra-如何获取最新值

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