宽泛的CQL - 如何获得最新的设置?

时间:2015-03-19 13:58:33

标签: cassandra cql cql3 cassandra-2.1

我如何编写CQL以从每一行获取最新的数据集?

我正在研究从MSSQL过渡到Cassandra并开始掌握这些概念。很多研究都有很大帮助,但我没有找到答案(我知道必须有办法):

CREATE TABLE WideData {
 ID text,
 Updated timestamp,
 Title text,
 ReportData text,
 PRIMARY KEY (ID, Updated)
} WITH CLUSTERING ORDER (Updated DESC) 

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title', 'Blah blah blah blah')
INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('bbb', NOW, 'Title', 'Blah blah blah blah')

等一分钟:

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('bbb', NOW, 'Title 2', 'Blah blah blah blah')

等3分钟:

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title 2', 'Blah blah blah blah')

等5分钟:

INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title 3', 'Blah blah blah blah')

我如何编写CQL以从每一行获取最新的数据集?

SELECT ID,Title FROM WideRow - 给我5行,因为它为我提供了数据。

基本上我希望(SELECT ID,Title FROM WideRow WHERE .....)的结果为:

ID   Title
aaa, Title3
bbb, Title2

另外,有没有办法计算宽行数据集的数量?

基本上相当于TSQL:SELECT ID,Count(*)FROM Table GROUP BY ID

ID   Count
aaa  3
bbb  2

由于

此外,任何有关这些类型的查询的更多信息的参考资料也将受到赞赏。

1 个答案:

答案 0 :(得分:4)

使用您当前的数据模型,您只能按分区键查询最近的行。在您的情况下,即ID

SELECT ID, Title FROM WideData WHERE ID='aaa' LIMIT 1

由于您已按DESCending顺序在Updated上指明了群集顺序,因此将首先返回具有最新Updated时间戳的行。

根据您的预期结果,我将继续并假设您不希望单独查询每个分区键。 Cassandra仅按分区键维护CQL结果集顺序。 Cassandra也不支持聚合。因此,实际上无法同时为所有ID提供“最新”,也无法获得每个ID有多少更新的报告。

使用Cassandra数据建模,您需要构建表以满足您的查询。查询“计划”并不是Cassandra的强项(正如你所发现的那样)。要通过ID获取最新更新,您需要构建一个额外的查询表,该表旨在仅存储每个ID的最新更新。同样,要获取每个ID的更新计数,您可以使用counter coulmns创建一个额外的查询表,以适应该查询。

<强> TL;博士

在Cassandra中,非规范化和冗余数据存储是关键。对于某些应用程序,您可能需要为每个查询提供一个表...这没关系。

相关问题