cassandra - Cassandra - CQL 查询 [COUNT, ORDER_BY, GROUP_BY ]
问题描述
我是 Cassandra 的新手,我正在尝试更多地了解这个数据库引擎的工作原理(特别是 CQL 部分)并将其与 Mysql 进行比较。
考虑到这一点,我尝试了一些查询,但是有一个我无法弄清楚的特定查询。从我可以读到的接缝中,不可能在 Cassandra 中执行此查询,但我想确定是否有一些解决方法。
想象一下具有 PRIMARY_KEY = id 的下表 [Customer]:
id, name, city, country, email
01, Jhon, NY, USA, jhon@
02, Mary, DC, USA, mary@
03, Smith, L, UK, smith@
.....
我想获得一份清单,显示每个国家/地区有多少客户并按 DESC 订购。
在 mySQL 中,它类似于
SELECT COUNT(Id), country
FROM customer
GROUP BY country
ORDER BY COUNT(Id) DESC
但是在 Cassandra (CQL) 中,似乎我不能对不是 PRIMARY_KEY 的列进行 GROUP BY (例如 "country" 的情况),无论如何都围绕这个?
解决方案
在 Cassandra 中构建表时要记住的主要事情是根据您计划查询它的方式对其 PRIMARY KEY 进行建模。在任何情况下,定义id
为 PRIMARY KEY 对您尝试做的事情都不是很有帮助。
此外,关键字喜欢GROUP BY
和ORDER BY
有特殊要求。 ORDER BY
特别是非常没用(IMO),除非您打算反转排序方向。但是您不能选择任意列来对数据进行排序。
为了解决您上面的查询,我将创建一个新表,以 、 和 列为键country
(city
按此id
顺序):
CREATE TABLE customer_by_city (
id TEXT,
name TEXT,
city TEXT,
country TEXT,
email TEXT,
PRIMARY KEY (country,city,id)
) WITH CLUSTERING ORDER BY (city ASC, id DESC);
现在,我将插入行:
INSERT INTO customer_by_city (id,name,city,country,email)
VALUES ('01', 'Jhon', 'NY', 'USA', 'jhon@gmail.com');
INSERT INTO customer_by_city (id,name,city,country,email)
VALUES ('02', 'Mary', 'DC', 'USA', 'mary@gmail.com');
INSERT INTO customer_by_city (id,name,city,country,email)
VALUES ('03', 'Smith', 'London', 'UK', 'smith@gmail.com');
SELECT COUNT(Id), country FROM customer_by_city GROUP BY country ;
system.count(id) | country
------------------+---------
2 | USA
1 | UK
(2 rows)
Warnings :
Aggregation query used without partition key
笔记:
- 最后一条消息意味着您正在运行一个没有由分区键作为键的 WHERE 子句的查询。这意味着 Cassandra 将不得不检查集群中的每个节点来服务这个查询。 效率极低。
- 虽然它适用于本示例,但
country
作为分区键可能不是分发数据的最佳方式。毕竟,如果大多数客户都在一个特定的国家/地区,那么他们可能会突破最大分区大小的界限。
推荐阅读
- c# - MSBuild 正在“Visual Studio 命令提示符”中运行
- python - 使用模数抓取矩阵边缘上的节点
- c# - 在服务“Service1”实施的合同列表中找不到合同名称“TPUSRER.IService1”
- swiftui - NavigationView swiftui不是全屏
- java - 使用 SelectionMode.MULTI 将行的单击事件添加/创建到 Vaadin 网格?
- json - 如何为两个类的 Map 定义隐式?
- azure - “所有其他操作”的 Azure Blobs 计费细分
- javascript - 尝试使用 JS 获取查询字符串参数
- postgresql - 检查 json 数组中的值
- java - principal_name 列未更新且应用程序未访问 /originalurl