带有宽行的CQL - 如何获取最近的设置?

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表GROUP BY ID

ID   Count
aaa  3
bbb  2

谢谢

另外,如果有关于这些查询类型更多学习的参考资料也会很有帮助。

1个回答

4

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

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

由于您已经在更新时间上以降序指定了聚类顺序,因此将首先返回具有最近更新时间戳的行。
考虑到您想要的结果,我会假设您不想逐个查询每个分区键。Cassandra仅按分区键维护CQL结果集排序。此外,Cassandra不支持聚合。因此,没有办法一次获取所有ID的“最新”更新,也没有办法获得每个ID的更新数报告。
使用Cassandra数据建模,您需要构建适合您的查询的表格。查询“规划”实际上并不是Cassandra的强项(正如您所发现的那样)。为了按ID获取最近的更新,您需要构建一个额外的查询表,该表专门设计用于存储每个ID的最新更新。同样,为了获取每个ID的更新计数,您可以创建一个额外的查询表,并使用计数列来满足该查询。
在Cassandra中,去规范化和冗余数据存储是关键。对于某些应用程序,您可以为每个需要支持的查询使用一个表...这没问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接