【问题标题】:Cannot sort partitions in DjangoCassandraModel, "ORDER BY is only supported when the partition key is restricted by an EQ or an IN."无法在 DjangoCassandraModel 中对分区进行排序,“仅当分区键受 EQ 或 IN 限制时才支持 ORDER BY。”
【发布时间】:2021-11-22 14:22:44
【问题描述】:
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 仅在分区键为 受 EQ 或 IN 限制。”

你好。我在 Cassandra 中有一个动态 Django 模型创建。 (时间,价值)测量。如何根据时间(主键)获取表中的最后一个元素?我的实现有错误。

【问题讨论】:

    标签: django cassandra


    【解决方案1】:

    如错误消息所述,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 中没有集群列)。干杯!

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2015-02-10
      • 2018-11-06
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多