Car*_*ter 5 cql cassandra 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')
Run Code Online (Sandbox Code Playgroud)
等1分钟:
INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('bbb', NOW, 'Title 2', 'Blah blah blah blah')
Run Code Online (Sandbox Code Playgroud)
等3分钟:
INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title 2', 'Blah blah blah blah')
Run Code Online (Sandbox Code Playgroud)
等5分钟:
INSERT INTO WideData (ID, Updated, Title, ReportData) VALUES ('aaa', NOW, 'Title 3', 'Blah blah blah blah')
Run Code Online (Sandbox Code Playgroud)
如何编写CQL以从每行获取最新的数据集?
SELECT ID,Title FROM WideRow - 给我5行,因为它为我提供数据.
基本上我想要(SELECT ID,Title FROM WideRow WHERE .....)的结果是:
ID Title
aaa, Title3
bbb, Title2
Run Code Online (Sandbox Code Playgroud)
另外,有没有办法计算宽行数据集的数量?
本质上相当于TSQL:SELECT ID,Count(*)FROM Table GROUP BY ID
ID Count
aaa 3
bbb 2
Run Code Online (Sandbox Code Playgroud)
谢谢
此外,任何参考以了解有关这些类型的查询的更多信息也将受到赞赏.
使用当前的数据模型,您只能通过分区键查询最新行。就你而言,那就是ID.
SELECT ID, Title FROM WideData WHERE ID='aaa' LIMIT 1
Run Code Online (Sandbox Code Playgroud)
由于您已按降序指示聚类顺序,因此将首先返回Updated具有最新时间戳的行。Updated
考虑到您想要的结果,我将继续假设您不想单独查询每个分区键。Cassandra 仅按分区键维护 CQL 结果集顺序。Cassandra 也不支持聚合。因此,确实没有办法ID一次获得所有的“最新”信息,也没有办法获得每个人有多少更新的报告ID。
使用 Cassandra 数据建模,您需要构建适合您的查询的表。查询“规划”并不是 Cassandra 的真正强项(正如您所发现的)。要获取最新更新ID,您需要构建一个额外的查询表,旨在仅存储每个 ID 的最新更新。同样,要获取每个更新的计数,您可以使用计数器ID创建一个附加查询表来适应该查询。
太长了;博士
在Cassandra中,非规范化和冗余数据存储是关键。对于某些应用程序,您可能需要为每个需要支持的查询准备一张表……这没关系。
| 归档时间: |
|
| 查看次数: |
850 次 |
| 最近记录: |