Использование CQL для обхода ключей разделов таблицы Cassandra

Как с помощью CQL3 перечислить все ключи разделов таблицы в Cassandra? В частности, возникают сложности с возвратом отдельных ключей и разбиением результатов на страницы.


person Matt Joiner    schedule 14.08.2013    source источник
comment
Прочтите эту запись в блоге Ричарда, в ней очень подробно рассказывается, почему трудно сосчитать ключи. в распределенной системе.   -  person Lyuben Todorov    schedule 14.08.2013
comment
@LyubenTodorov: Я знаю о трудностях. Однако я сразу после ключей, меня не волнует счет или согласованность.   -  person Matt Joiner    schedule 14.08.2013


Ответы (3)


Я думаю, что с небольшим предварительным знанием возможных значений ваших ключей это можно сделать с помощью функции токена. Взгляните на этот ответ. Это то, что вы ищете?

Кроме того, родная нумерация страниц, по-видимому, является предстоящей функцией версии 2.0. Это в последней бета-версии.

Пока не выйдет версия 2.0, вы можете видеть это обходной путь для разбиения на страницы в блоге datastax (перейдите в раздел "Разбиение на страницы CQL3"). В принципе, это почти то же самое, что и ссылка, которую я разместил выше, но очень подробно рассказывается, как реализовать разбиение на страницы с учетом ключей столбцов и т. Д.

person John    schedule 14.08.2013
comment
Связанный ответ не допускает разбиения на страницы для этой цели. - person Matt Joiner; 14.08.2013
comment
Я обновил свой ответ, чтобы связать более подробный пример того, как использовать токен и ограничивать запросы, на которые я ссылался ранее. - person John; 14.08.2013
comment
О подкачке с использованием функции TOKEN здесь на странице документов DataStax . - person Bazi; 12.02.2015

Вы можете сделать это, как в следующем примере. Создайте тестовую таблицу:

> create table partition_keys_test (p_key text PRIMARY KEY, rest text);

и вставьте несколько строк, например:

> insert into partition_keys_test (p_key, rest) VALUES ('1', 'blah');

Я сделал это для p_key '1', '2',..., '9'.

Затем пролистайте ключи разделов. Начните с:

> select p_key from partition_keys_test limit 2;
 p_key
 -------
     6
     7

для размера страницы 2. Затем возьмите последний результат p_key и используйте его в следующем запросе:

> select p_key from partition_keys_test where token(p_key) > token('7') limit 2;
 p_key
 -------
    9
    4

и так далее, пока не получите результат меньше размера страницы.

Обратите внимание, что вы должны ожидать, что это прочитает весь ваш набор данных. Для очень широких строк это может быть не так, но все равно будет очень много операций ввода-вывода.

Кроме того, если строки создаются или удаляются и имеют маркеры выше, чем у вас есть до сих пор, они будут отображаться в последующих запросах. Таким образом, если вы выполняете вышеуказанные запросы на подкачку во время создания или удаления строк, ключи секции могут быть возвращены или не возвращены в зависимости от времени.

person Richard    schedule 14.08.2013
comment
Что вы можете использовать в качестве начального токена, не имея двух разных строк запроса? Как ваш запрос будет обрабатывать несколько строк для каждого первичного ключа? Например, представьте, что в первичном ключе было 2 поля, p_key — это ключ раздела. Теперь может быть несколько строк с одним и тем же ключом p_key. - person Matt Joiner; 14.08.2013
comment
token('') возвращает минимум, поэтому вы можете заменить первый запрос на select p_key from partition_keys_test where token(p_key) > token('') limit 2;. Если у вас есть составной первичный ключ, вы получите дубликаты. Я не думаю, что есть какой-либо способ отфильтровать дубликаты на стороне сервера. - person Richard; 14.08.2013
comment
Правильно, но это не работает в общем случае составного ПК; см. мой ответ ниже. - person jbellis; 15.08.2013
comment
Помимо раздражающей ручной фильтрации дубликатов, почему этот метод не получит все ключи разделов? - person Richard; 15.08.2013

Плохая новость заключается в том, что на данный момент (август 2013 г.) вам нужно выбрать весь первичный ключ, а не только ключ раздела, чтобы просмотреть их. С составным PK это может включать в себя множество повторяющихся ключей раздела.

Хорошая новость заключается в том, что https://issues.apache.org/jira/browse/CASSANDRA-4536 открыт, чтобы разрешить SELECT DISTINCT для особого случая ключей раздела в 2.0.1, поскольку можно эффективно получить уникальные ключи раздела изнутри; CQL просто не имеет хорошего способа выразить это до тех пор.

person jbellis    schedule 15.08.2013