2016-02-17 2 views
6

Я хочу получить последнюю вставленную строку в таблице Кассандры. Как его получить? Есть идеи?Как получить последнюю вставленную строку в Кассандре?

Я разрабатываю проект для этого, я заменяю mysql на cassandra. Я хочу избавиться от всех запросов sql и написать их все в cassandra.

+0

В любой кластерной среде определение последней вставленной записи практически невозможно. Кассандра не исключение. –

+0

Для людей Cassandra: концепция «последней вставленной строки» в MySQL фактически является (автоинкрементным) идентификатором строки, которая была просто вставлена ​​вашим клиентом с помощью инструкции INSERT. Это реальная проблема в Cassandra, если, например, ваш первичный ключ является 'timeuuid', и вы используете функцию' now() 'для автоматического создания значения для новой строки. По-видимому, нет никакого способа определить timeuuid новой строки, хотя это похоже на легкую вещь для добавления к драйверу. – Shannon

ответ

2

Я хочу получить последний вставленный ряд в таблице Кассандры. Как его получить? Есть идеи?

Это не возможно, то, что вы просите это шаблон очереди (дайте мне последнее сообщение) и очередь является известным антишаблоном для Cassandra

8

Просто, чтобы придать немного понимания. ..

Как и во всех проблемах с проблемой 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 или любой РСУБД. Если запрашивать последнюю обновленную строку (для раздела) - это то, что вам нужно сделать, возможно, есть способы, которыми вы можете смоделировать таблицу для ее поддержки.

+0

Спасибо Аарон .. :) – Mohanish

Смежные вопросы