【问题标题】:Cassandra - CQL queries [COUNT, ORDER_BY, GROUP_BY ]Cassandra - CQL 查询 [COUNT, ORDER_BY, GROUP_BY ]
【发布时间】:2019-05-04 02:44:26
【问题描述】:

我是 Cassandra 的新手,我正在尝试更多地了解这个数据库引擎的工作原理(特别是 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" 的情况),无论如何都围绕着这个???

【问题讨论】:

  • 虽然 CQL 类似于 SQL,但它不一样...要执行聚合、排序等操作,您需要以正确的方式对表进行建模。我建议参加有关 Cassandra 数据建模的 DS220 课程:academy.datastax.com/resources/ds220

标签: cassandra group-by cql


【解决方案1】:

您需要在“国家/地区”上定义二级索引。二级索引用于查询使用了通常不是查询表的列的表。

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

【讨论】:

  • 您不能在二级索引上使用GROUP BY。此外,二级索引通常不能很好地扩展。
【解决方案2】:

在 Cassandra 中构建表时要记住的主要事情是根据您计划查询它的方式对其 PRIMARY KEY 进行建模。在任何情况下,将 id 定义为 PRIMARY KEY 对您要执行的操作没有多大帮助。

此外,GROUP BYORDER BY 等关键字也有特殊要求。 ORDER BY 特别是非常没用(IMO),除非您打算反转排序方向。但是您不能选择任意列来对数据进行排序。

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

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 作为分区键可能不是分发数据的最佳方式。毕竟,如果大多数客户都在一个特定的国家/地区,那么他们可能会突破最大分区大小的界限。

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 2015-03-10
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2013-10-14
    • 2013-01-02
    相关资源
    最近更新 更多