Главное, что нужно помнить при создании таблицы в Кассандре, - это смоделировать ее ПЕРВИЧНЫЙ КЛЮЧ на основе того, как вы планируете его запрашивать.В любом случае, определение 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 с ключом раздела.Это означает, что Кассандре придется проверять каждый узел в кластере для обслуживания этого запроса. Очень неэффективно.
- Хотя это работает для данного примера,
country
в качестве ключа раздела может быть не лучшим способом для распространения данных.В конце концов, если большинство клиентов находятся в одной конкретной стране, они потенциально могут раздвинуть границы максимального размера раздела.