Просто, чтобы придать немного понимания. ..
Как и во всех проблемах с проблемой Cassandra, запрос должен обслуживаться специально разработанной для него моделью. Это называется моделированием на основе запросов. Запрос последней вставленной строки не является неотъемлемой функцией, встроенной в каждую таблицу. Вам нужно будет спроектировать свою модель, чтобы поддерживать это раньше времени.
Например, скажем, у меня есть таблица хранения данных для пользователей.
CREATE TABLE users (
username TEXT,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username));
Если бы я был запустить SELECT * FROM users LIMIT 1
на этом столе, мой результирующий набор будет содержать одну строку. Эта строка будет той, которая содержит самое низкое хэшированное значение username
(мой ключ раздела), так как Cassandra хранит данные в кластере. Я бы не знал, был ли это последний добавленный или нет, так что это было бы не очень полезно для вас.
С другой стороны, допустим, у меня была таблица, предназначенная для отслеживания обновлений, которые пользователи внесли в их учетную информацию.
CREATE TABLE userUpdates (
username TEXT,
lastUpdated TIMEUUID,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username,lastUpdated))
WITH CLUSTERING ORDER BY (lastUpdated DESC);
Далее я upsert 3 строки:
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('bkerman',now(),'[email protected]','Bob','Kerman');
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('jkerman',now(),'[email protected]','Jebediah','Kerman');
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('bkerman',now(),'[email protected]','Bob','Kerman');
> SELECT username, email, dateof(lastUpdated) FROM userupdates;
username | email | system.dateof(lastupdated)
----------+-------------------+----------------------------
jkerman | [email protected] | 2016-02-17 15:31:39+0000
bkerman | [email protected] | 2016-02-17 15:32:22+0000
bkerman | [email protected] | 2016-02-17 15:31:38+0000
(3 rows)
Если я просто SELECT username, email, dateof(lastUpdated) FROM userupdates LIMIT 1
я буду получать данные Джедедия Керман, которая не является наиболее недавно обновлен. Однако, если я ограничу свой раздел на username='bkerman'
, с LIMIT 1
, я получу самую последнюю строку для Боба Кермана.
> SELECT username, email, dateof(lastUpdated) FROM userupdates WHERE username='bkerman' LIMIT 1;
username | email | system.dateof(lastupdated)
----------+-------------------+----------------------------
bkerman | [email protected] | 2016-02-17 15:32:22+0000
(1 rows)
Это работает, потому что я указал кластеризация порядок убыванию на lastUpdated
:
WITH CLUSTERING ORDER BY (lastUpdated DESC);
Таким образом, результаты в пределах каждого раздела будут возвращены с наиболее недавно upserted подряд на сверху, следовательно LIMIT 1
становится способом запроса самой последней строки.
Таким образом, важно понимать, что:
- Cassandra упорядочивает данные в кластере на величину хэшированном ключа секционирования. Это помогает обеспечить более равномерное распределение данных.
- Cassandra
CLUSTERING ORDER
обеспечивает порядок сортировки данных на диске в пределах ключ раздела.
- Пока вы не сможете получить самую последнюю обновленную строку для каждой таблицы, вы можете получить модели, чтобы вернуть эту строку вам для каждого раздел.
tl; dr; Querying in Cassandra намного отличается от запросов MySQL или любой РСУБД. Если запрашивать последнюю обновленную строку (для раздела) - это то, что вам нужно сделать, возможно, есть способы, которыми вы можете смоделировать таблицу для ее поддержки.
В любой кластерной среде определение последней вставленной записи практически невозможно. Кассандра не исключение. –
Для людей Cassandra: концепция «последней вставленной строки» в MySQL фактически является (автоинкрементным) идентификатором строки, которая была просто вставлена вашим клиентом с помощью инструкции INSERT. Это реальная проблема в Cassandra, если, например, ваш первичный ключ является 'timeuuid', и вы используете функцию' now() 'для автоматического создания значения для новой строки. По-видимому, нет никакого способа определить timeuuid новой строки, хотя это похоже на легкую вещь для добавления к драйверу. – Shannon