cassandra-cql查询[count,order\u by,group\u by]

2o7dmzc5  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(567)

我是cassandra的新手,我正在尝试更多地了解db引擎的工作原理(特别是cql部分),并将其与mysql进行比较。
考虑到这一点,我尝试了一些查询,但有一个特定的查询我想不出来。从我所读到的信息来看,在cassandra中不可能进行这个查询,但是我想确定是否有一些工作可以解决这个问题。
设想下表[customer],主键=id:

id, name, city, country, email 
01, Jhon, NY, USA, jhon@
02, Mary, DC, USA, mary@
03, Smith, L, UK, smith@
.....

我想得到一个清单,显示我有多少客户,我每个国家和订单描述。
在mysql中

SELECT COUNT(Id), country 
FROM customer
GROUP BY country
ORDER BY COUNT(Id) DESC

但是在cassandra(cql)中,似乎我不能对不是主键的列进行分组(比如“country”),这周围有没有其他的东西???

nuypyhwy

nuypyhwy1#

在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

笔记:
最后一条消息意味着您正在运行一个查询,但没有分区键所设置的where子句。这意味着cassandra必须检查集群中的每个节点才能为这个查询提供服务。效率很低。
虽然对这个例子有效, country 因为分区键可能不是分发数据的最佳方式。毕竟,如果大多数客户都在一个特定的国家,那么他们可能会突破最大分区大小的限制。

v1uwarro

v1uwarro2#

你需要定义一个关于“国家”的二级索引。辅助索引用于使用通常不是查询表的列来查询表。
对于order by,在“id”上定义聚类键。聚类键负责对分区内的数据进行排序。

相关问题