cassandra java 驱动程序 queryBuilder 排序的本质是什么
what's the nature ordering by cassandra java driver queryBuilder
我有 cassandra table,分区键作为电子邮件,集群键作为主题(字符串)和 eventAt(时间戳),我需要查询 table 以获得最近的 N 个主题,最近由 eventAt 决定,这是我的查询:
BuiltStatement builtStatement =
QueryBuilder.select()
.all()
.from("email_table")
.where(QueryBuilder.eq(Email.COLUMN_EMAIL, bindMarker()))
.and(QueryBuilder.eq(Email.COLUMN_TOPIC, bindMarker()))
.limit(bindMarker());
结果按 eventAt 列按 desc 顺序排序,虽然这是我期望的结果,但想知道 Cassandra 如何处理查询结果排序?我以为它会按 eventAt 列按升序排列,但显然不是
Cassandra 通常returns 数据根据定义的聚簇列排序。所以如果你有这样的table:
create table tbl (
email text,
topic text,
eventAt timestamp,
....,
primary key (email, topic, eventAt)
) with clustering order by (topic asc, eventAt desc);
然后当您查询数据时,数据以排序的形式返回 - 因为它们存储在磁盘上 - 根据 clustering order by
中的定义(SSTables 是排序字符串的首字母缩写词 tables),然后依次阅读:
- 先按主题排序,升序排列
- 在特定主题内,按
eventAt
降序排列
您可能对查询数据时更改排序顺序的支持有限,但这只是更改读取数据的顺序,如果您有多个聚类列,您可能会对结果感到惊讶 - 通常它仅适用于查询中使用的最后一个聚类列。
如果你想有 N 个最近的主题,那么你需要有另一个 table,其中 eventAt
作为第一个聚类列:
create table tbl (
email text,
topic text,
eventAt timestamp,
....,
primary key (email, eventAt, topic)
) with clustering order by (topic asc, eventAt desc);
然后你可以通过应用select ... from tbl ... limit N
.
轻松获得最后N个主题
我有 cassandra table,分区键作为电子邮件,集群键作为主题(字符串)和 eventAt(时间戳),我需要查询 table 以获得最近的 N 个主题,最近由 eventAt 决定,这是我的查询:
BuiltStatement builtStatement =
QueryBuilder.select()
.all()
.from("email_table")
.where(QueryBuilder.eq(Email.COLUMN_EMAIL, bindMarker()))
.and(QueryBuilder.eq(Email.COLUMN_TOPIC, bindMarker()))
.limit(bindMarker());
结果按 eventAt 列按 desc 顺序排序,虽然这是我期望的结果,但想知道 Cassandra 如何处理查询结果排序?我以为它会按 eventAt 列按升序排列,但显然不是
Cassandra 通常returns 数据根据定义的聚簇列排序。所以如果你有这样的table:
create table tbl (
email text,
topic text,
eventAt timestamp,
....,
primary key (email, topic, eventAt)
) with clustering order by (topic asc, eventAt desc);
然后当您查询数据时,数据以排序的形式返回 - 因为它们存储在磁盘上 - 根据 clustering order by
中的定义(SSTables 是排序字符串的首字母缩写词 tables),然后依次阅读:
- 先按主题排序,升序排列
- 在特定主题内,按
eventAt
降序排列
您可能对查询数据时更改排序顺序的支持有限,但这只是更改读取数据的顺序,如果您有多个聚类列,您可能会对结果感到惊讶 - 通常它仅适用于查询中使用的最后一个聚类列。
如果你想有 N 个最近的主题,那么你需要有另一个 table,其中 eventAt
作为第一个聚类列:
create table tbl (
email text,
topic text,
eventAt timestamp,
....,
primary key (email, eventAt, topic)
) with clustering order by (topic asc, eventAt desc);
然后你可以通过应用select ... from tbl ... limit N
.