我是Cassandra的新手,我正在尝试更多地了解这个DB引擎是如何工作的(特别是CQL部分),并将其与Mysql进行比较。
考虑到这一点,我尝试了一些查询,但有一个特定的查询我无法理解。据我所知,在Cassandra中做这个查询是不可能的,但我想确切地知道有没有什么解决办法。
假设下面的表Customer具有PRIMARY_KEY = id:
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“的例子),有没有解决这个问题的办法?
发布于 2018-12-03 10:35:37
您需要在"country“上定义一个二级索引。辅助索引用于使用通常不是查询表的列来查询表。
对于ORDER BY,您在‘id’上定义聚集键。聚集键负责对分区内的数据进行排序。
发布于 2018-12-03 23:12:50
在Cassandra中构建表时,需要记住的主要内容是根据您计划如何查询它来对其主键进行建模。在任何情况下,将id
定义为主键对于您要做的事情都没有多大帮助。
此外,像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
备注:
country
作为分区键可能不是分发数据的最佳方式。毕竟,如果大多数客户在一个特定的国家,那么他们可能会突破最大分区大小的界限。https://stackoverflow.com/questions/53583031
复制相似问题