宽行的 CQL - 如何获得最新的设置?
CQL with a wide row - how to get most recent set?
我将如何编写 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
谢谢
此外,任何有关这些类型查询的详细信息的参考资料也将不胜感激。
使用您当前的数据模型,您只能通过分区键查询最近的行。在您的情况下,即 ID
.
SELECT ID, Title FROM WideData WHERE ID='aaa' LIMIT 1
由于您已在 Updated
上以降序指示聚类顺序,因此将首先返回具有最新 Updated
时间戳的行。
鉴于您想要的结果,我将继续并假设您不想单独查询每个分区键。 Cassandra 仅按分区键维护 CQL 结果集顺序。 Cassandra 也不支持聚合。因此,确实没有办法一次将所有 ID
的 "most recent" 放在一起,也没有办法获得每个 ID
有多少更新的报告。
使用 Cassandra 数据建模,您需要构建 tables 以满足您的查询。查询 "planning" 并不是 Cassandra 的强项(正如您所发现的)。要获取 ID
的最新更新,您需要构建一个额外的查询 table,旨在仅存储每个 ID 的最新更新。同样,要获取每个 ID
的更新计数,您可以使用 counter coulmns 创建一个附加查询 table 以适应该查询。
tl;dr
在Cassandra中,非规范化和冗余数据存储是关键。对于某些应用程序,您可能需要为每个需要支持的查询设置一个 table...没关系。
我将如何编写 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
谢谢
此外,任何有关这些类型查询的详细信息的参考资料也将不胜感激。
使用您当前的数据模型,您只能通过分区键查询最近的行。在您的情况下,即 ID
.
SELECT ID, Title FROM WideData WHERE ID='aaa' LIMIT 1
由于您已在 Updated
上以降序指示聚类顺序,因此将首先返回具有最新 Updated
时间戳的行。
鉴于您想要的结果,我将继续并假设您不想单独查询每个分区键。 Cassandra 仅按分区键维护 CQL 结果集顺序。 Cassandra 也不支持聚合。因此,确实没有办法一次将所有 ID
的 "most recent" 放在一起,也没有办法获得每个 ID
有多少更新的报告。
使用 Cassandra 数据建模,您需要构建 tables 以满足您的查询。查询 "planning" 并不是 Cassandra 的强项(正如您所发现的)。要获取 ID
的最新更新,您需要构建一个额外的查询 table,旨在仅存储每个 ID 的最新更新。同样,要获取每个 ID
的更新计数,您可以使用 counter coulmns 创建一个附加查询 table 以适应该查询。
tl;dr
在Cassandra中,非规范化和冗余数据存储是关键。对于某些应用程序,您可能需要为每个需要支持的查询设置一个 table...没关系。