Django cassandra engine get last item

from cassandra.cqlengine import columns
from django_cassandra_engine.models import DjangoCassandraModel
from django.db import connections

    def get_tag(car_name, car_type):
        class Tag(DjangoCassandraModel):
            __table_name__ = car_name + "_" + car_type
    
            time = columns.Integer(primary_key=True, required=True)  # unix time in seconds  # noqa
            value = columns.Float(required=True)
    
            with connections['cassandra'].cursor() as cursor:
                cursor.execute("CREATE TABLE IF NOT EXISTS mydatabase." + __table_name__ + " (time INT PRIMARY KEY, value FLOAT);")  # noqa
    
            def last():
                with connections['cassandra'].cursor() as cursor:
                    elem = cursor.execute("SELECT * FROM " + Tag.__table_name__ + " ORDER BY time DESC LIMIT 1;")  # noqa
                return elem
    
            def __str__(self) -> str:
                return str(self.time) + "," + str(self.value)
    
        return Tag

Использование в коде:

tag = get_tag(car_name, car_type)
last_elem = tag.last()

Произошла ошибка при вызове tag.last():

cassandra.InvalidRequest: Ошибка от сервера: code=2200 [Неверный запрос] message="ORDER BY поддерживается только в том случае, если ключ раздела ограничен эквалайзером или IN."

Здравствуйте. У меня есть создание динамической модели Django в Cassandra. (время, значение) измерения. Как получить последний элемент в таблице на основе времени (первичный ключ)? Моя реализация имеет ошибку.

Как говорится в сообщении об ошибке, предложение ORDER BY работает только тогда, когда вы сортируете строки внутри одного раздела, в частности, когда "ключ раздела ограничен".

В вашем случае вы выполняете полное сканирование таблицы (без предложения WHERE), поскольку ключ раздела не ограничен одним разделом:

SELECT * FROM ... ORDER BY time DESC LIMIT 1

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

Вы можете сортировать только по столбцу кластеризации. Например, если у вас есть таблица телефонных номеров:

CREATE TABLE phone_numbers_by_username (
  username text,
  phone_type text,
  phone_number text,
  PRIMARY KEY (username, phone_type)
)

Затем вы можете сортировать по типу телефона (домашний, мобильный, рабочий), если вы ограничите запрос одним разделом (username):

SELECT * FROM phone_numbers_by_username
  WHERE username = ?
  ORDER BY phone_type DESC

Однако в вашем случае это невозможно, поскольку каждый раздел в вашей таблице имеет только одну строку (нет столбцов кластеризации в PRIMARY KEY). Будьте здоровы!

Вернуться на верх