#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 минут. Ура!