Как получить последние 10 вставок в таблице Cassandra, разделенной по меткам времени?

#cassandra #cql

Вопрос:

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

У меня есть эта таблица, которая содержит метку времени в качестве первичного ключа и случайное значение:

 CREATE TABLE IF NOT EXISTS rand_keyspace.rands (
timestamp bigint,
randnumber float,
PRIMARY KEY (timestamp));
 

Я хотел бы получить последние 10 вставленных строк.

 SELECT * FROM rand_keyspace.rands ORDER BY timestamp DESC LIMIT 10;
 

и я получаю классическую ошибку:

 InvalidRequest: Error from server: code=2200 [Invalid query] message="ORDER BY is only supported when the partition key is restricted by an EQ or an IN."
 

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

Ответ №1:

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

В зависимости от количества случайных чисел, генерируемых с течением времени, я бы рекомендовал создать новый ключ раздела на основе компонента времени. Так что что-то вроде month или day может сработать.

 PRIMARY KEY (month, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);
 

Тогда этот запрос будет работать:

 SELECT * FROM rand_keyspace.rands
WHERE month='202110'
LIMIT 10;
 

С этим PRIMARY KEY и CLUSTERING ORDER определением вам не понадобится ORDER BY предложение, так как это произойдет по умолчанию (в порядке убывания).

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

Ответ №2:

Чтобы добавить к [фантастическому] ответу Аарона, сортировка по ключу раздела не поддерживается, поскольку для этого требуется полное сканирование таблицы. Cassandra предназначена для рабочих нагрузок OLTP, когда вам нужно очень быстро извлечь один раздел.

У вас есть вариант использования аналитики, поэтому вместо простого CQL вам нужно использовать Spark для эффективного сканирования нескольких разделов. Это распространенный шаблон доступа для случаев использования, в которых необходимо определить, что изменилось за последние 5 минут. Ура!