Как установить auto increment ID (integer) в cassandra как SQL?

50
6

У меня есть миллионы записей, и теперь мне нужно взять последние последние записи. Я хочу сохранить каждую запись с помощью record_id, и я хочу, чтобы этот record_id автоматически увеличивался при вставке новой записи.

Для примера: предположим, что у меня 1000 записей, и сначала я хочу, чтобы последние 100 записей с 901 до 1000. Теперь по второму запросу я хочу, чтобы следующая 100 последних записей с 801 до 900. Я прошел через так много ссылок, но не нашел что-то важное. Может ли любое тело дать правильное решение?

Пусть предположим, что таблица emp содержит:
текст имени,
record_id int,
адресный текст

Предположим, что имя - это первичный ключ, а record_id - это кластерный ключ. Но, пожалуйста, не обсуждайте концепцию первичного ключа сейчас, потому что мое требование - создать id как кластерный ключ (я использую cassandra 2.2.3 и cql 3.3.1).

спросил(а) 2016-03-09T08:59:00+03:00 3 года, 11 месяцев назад
1
Решение
59

Идентификаторы Auto-increment действительно не работают в Cassandra или любой другой распределенной базе данных.

Зачем? Скажем, у вас есть три узла. Два узла получают запросы на запись в одну и ту же таблицу одновременно. Один проверяет таблицу на максимальный идентификатор и получает ответ (пример) 2544. Перед тем, как эту новую строку можно записать, другой узел выполняет тот же процесс, а также получает 2544. Теперь у вас есть две строки, вставленные с 2545, и в Кассандре последняя запись "выигрывает", поэтому вы потеряете первую запись.

Следовательно, это также объясняется тем, что подходы чтения перед записью считаются анти-шаблонами в Кассандре. Как предложил Стефан, TimeUUID предлагает способ решения этой проблемы.

В Кассандре вам нужно разработать таблицы, чтобы они соответствовали вашим шаблонам запросов. Я слышал, что вы хотите получить последние 100 обновленных сотрудников. Я бы создал конкретную таблицу, чтобы служить этому:

CREATE TABLE employee_updates (
datebucket text,
record_id timeuuid,
name text,
address text,
PRIMARY KEY (datebucket,record_id))
WITH CLUSTERING ORDER BY (record_id DESC);

Теперь, когда вы запрашиваете эту таблицу для последних 100 записей:

SELECT * FROM employee_udpates WHERE datebucket='20160309' LIMIT 100;

Вы можете получить самые последние 100 записей за этот конкретный день.

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

ОБНОВИТЬ:

что, если я хочу, чтобы предыдущие 100 записей, которые составляют от 801 до 900

Результатом этого решения действительно является "страница".

Вставьте несколько строк в таблицу:

> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'123 main st.','Bob Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'456 Gene ave.','Bill Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'34534 Water st.','Jebediah Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'843 Rocket dr.','Valentina Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'33476 Booster way','Isabella Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'43 Solid Rocket pl.','Helcine Kerman');

Теперь позвольте мне выбрать верхнюю 3 самых последних на сегодняшний день:

> SELECT datebucket, record_id, dateof(record_id), name 
FROm employee_updates WHERE datebucket='20160309' LIMIT 3;

datebucket | record_id | system.dateof(record_id) | name
------------+--------------------------------------+--------------------------+------------------
20160309 | 511f9150-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:43:02+0000 | Helcine Kerman
20160309 | 2f9f3670-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:42:06+0000 | Isabella Kerman
20160309 | 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:46+0000 | Valentina Kerman

(3 rows)

Поскольку я кластерировал эту таблицу в record_id в порядке DESCending, я могу получить следующие 3 записи, просто запросив для record_id меньше, чем последний, который я прочитал. В этом случае это будет 23b0dc60-e5db-11e5-a4ba-a52893cc9f36:

> SELECT datebucket, record_id, dateof(record_id), name 
FROm employee_updates WHERE datebucket='20160309'
AND record_id < 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 LIMIT 3;

datebucket | record_id | system.dateof(record_id) | name
------------+--------------------------------------+--------------------------+-----------------
20160309 | 16400100-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:23+0000 | Jebediah Kerman
20160309 | 0b239cf0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:05+0000 | Bill Kerman
20160309 | 00d648b0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:40:47+0000 | Bob Kerman

(3 rows)

ответил(а) 2016-03-09T12:08:00+03:00 3 года, 11 месяцев назад
52

Идентификаторы Auto-increment не поддерживаются в Cassandra. Но вместо этого вы можете использовать UUID, основанный на времени, в качестве ключа кластеризации, чтобы убедиться, что записи будут упорядочены от самых старых до самых последних.

ответил(а) 2016-03-09T11:24:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема