首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cassandra - CQL查询[COUNT,ORDER_BY,GROUP_BY ]

Cassandra - CQL查询[COUNT,ORDER_BY,GROUP_BY ]
EN

Stack Overflow用户
提问于 2018-12-03 01:56:35
回答 2查看 3.6K关注 0票数 1

我是Cassandra的新手,我正在尝试更多地了解这个DB引擎是如何工作的(特别是CQL部分),并将其与Mysql进行比较。

考虑到这一点,我尝试了一些查询,但有一个特定的查询我无法理解。据我所知,在Cassandra中做这个查询是不可能的,但我想确切地知道有没有什么解决办法。

假设下面的表Customer具有PRIMARY_KEY = id:

代码语言:javascript
运行
复制
id, name, city, country, email 
01, Jhon, NY, USA, jhon@
02, Mary, DC, USA, mary@
03, Smith, L, UK, smith@
.....

我想得到一个清单,显示我有多少客户每个国家和订单按DESC。

在mySQL中,它可能类似于

代码语言:javascript
运行
复制
SELECT COUNT(Id), country 
FROM customer
GROUP BY country
ORDER BY COUNT(Id) DESC

但是在Cassandra (CQL)中,我似乎不能对不是PRIMARY_KEY的列做GROUP BY (就像"country“的例子),有没有解决这个问题的办法?

EN

回答 2

Stack Overflow用户

发布于 2018-12-03 10:35:37

您需要在"country“上定义一个二级索引。辅助索引用于使用通常不是查询表的列来查询表。

对于ORDER BY,您在‘id’上定义聚集键。聚集键负责对分区内的数据进行排序。

票数 0
EN

Stack Overflow用户

发布于 2018-12-03 23:12:50

在Cassandra中构建表时,需要记住的主要内容是根据您计划如何查询它来对其主键进行建模。在任何情况下,将id定义为主键对于您要做的事情都没有多大帮助。

此外,像GROUP BYORDER BY这样的关键字也有特殊的要求。ORDER BY是非常无用的(IMO),除非你打算颠倒排序方向。但是您不能选择任意一列来对数据进行排序。

为了解决上面的查询,我将创建一个新表,以countrycityid列为关键字(按顺序):

代码语言:javascript
运行
复制
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);

现在,我将插入行:

代码语言:javascript
运行
复制
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作为分区键可能不是分发数据的最佳方式。毕竟,如果大多数客户在一个特定的国家,那么他们可能会突破最大分区大小的界限。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53583031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档