5

我将如何编写 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')

等待 1 分钟:

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

谢谢

此外,任何参考以了解有关这些类型的查询的更多信息也将不胜感激。

4

1 回答 1

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创建一个附加查询表以适应该查询。

tl;博士

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

于 2015-03-19T14:53:14.303 回答