database - Cassandra 顺序和聚类键

标签 database cassandra cql cql3

我有这张表:

CREATE TABLE custumer_events_service.events_by_websiteId_time(
    "event_id" text,
    "currentTime" timestamp,
    "websiteId" varchar,

    OTHER COLUMNS ...

    PRIMARY KEY(event_id, websiteId, currentTime)
)

在这种情况下,当我执行此查询时,我会得到按 currenttime 排序的 10000 行吗:

SELECT * FROM events_by_websiteid_time WHERE websiteid='xxxx' LIMIT 10000 ALLOW FILTERING;

还是我必须在末尾添加 WITH CLUSTERING ORDER BY (currentTime DESC);

最佳答案

Cassandra 只能在分区内执行排序顺序。当你使用 ALLOW FILTERING为避免必须提供您的分区键 ( event_id ),您的结果集将按每个 event_id 的散列标记值排序。 ,然后通过 websiteidcurrentTime .

让您的结果按 currentTime 排序,您需要创建一个新的查询表或更改现有表的 PRIMARY KEY 定义(可能还有 CLUSTERING ORDER)。如果您决定创建一个新的查询表,它必须看起来像这样:

CREATE TABLE custumer_events_service.events_by_websiteId_time_eventid(
  event_id text,
  currentTime timestamp,
  websiteId varchar,

OTHER COLUMNS ...

  PRIMARY KEY (websiteid,currentTime,event_id))
WITH CLUSTERING ORDER BY (currentTime DESC, event_id ASC);

这将允许这个查询:

SELECT * FROM events_by_websiteid_time_eventid WHERE websiteid='xxxx' LIMIT 10000;

...按照您的预期工作。

关于database - Cassandra 顺序和聚类键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35729937/

相关文章:

Swift:for循环等待响应并根据响应返回值

mysql - "leaflet"如何使用 MySQL 数据库存储和检索(搜索)标记?

mysql - 将从另一个表获得的值添加到所有行

日期时间字段上的 MySQL 索引不是 RANGE 类型,而是使用 INDEX 类型

python - 使用python时cassandra错误 "Batch too large"

cassandra - 二级索引列上的 CQL 和范围

python - 在 Cassandra 中创建现有 key 空间的副本(使用新名称)

JAVA - Cassandra 设置批量大小

cassandra - ScyllaDB - [无效查询] 消息 ="marshaling error: Milliseconds length exceeds expected (6)"

cassandra - 使用 cql 相对于 thrift 的优点