当前位置: 首页 > 知识库问答 >
问题:

Cassandra-CQL-按分区键按描述排序

汪天宇
2023-03-14

我在Cassandra中创建了一个表,用于监控应用程序的插入。我的分区键是一个int,由年月日组成,我的集群键是一个时间戳,之后是我的用户名和其他一些字段。

我想显示最后5个插入,但似乎分区键位于“order by desc”之前。

怎样才能得到正确的结果?正常的聚类键归纳顺序,为什么我会得到这个结果?(提前致谢)

信息:

Query : select tsp_insert, txt_name from ks_myKeyspace.myTable limit 5;

结果:

 idt_day  | tsp_insert               | txt_name  
----------+--------------------------+----------
 20161028 | 2016-10-28 15:21:09+0000 | Jean
 20161028 | 2016-10-28 15:21:01+0000 | Michel
 20161028 | 2016-10-28 15:20:44+0000 | Quentin
 20161031 | 2016-10-31 09:24:32+0000 | Jacquie
 20161031 | 2016-10-31 09:23:32+0000 | Gabriel

通缉:< br >

 idt_day  | tsp_insert               | txt_name  
----------+--------------------------+----------
 20161031 | 2016-10-31 09:24:32+0000 | Jacquie
 20161031 | 2016-10-31 09:23:32+0000 | Gabriel
 20161028 | 2016-10-28 15:21:09+0000 | Jean
 20161028 | 2016-10-28 15:21:01+0000 | Michel
 20161028 | 2016-10-28 15:20:44+0000 | Quentin

我的表:

CREATE TABLE ks_myKeyspace.myTable(
idt_day int,
tsp_insert timestamp,
txt_name  text, ...
PRIMARY KEY (idt_day, tsp_insert)) WITH CLUSTERING ORDER BY (tsp_insert DESC);

共有2个答案

长孙泉
2023-03-14

在我看来,你把整个事情都搞错了。分区键不用于对数据进行排序,它们仅用于了解数据在集群中的位置,尤其是节点。此外,顺序只在分区内部真正重要...

您的查询结果确实是不可预测的。根据哪个节点的回答速度更快(假设是群集而不是单个节点),每次都可以获得不同的结果。您应该尽量避免在没有分区限制的情况下进行选择,因为它们不会扩展。

但是,您可以更改查询并每天执行一次选择,然后以有序方式查询有序数据(您的聚类键)(您手动选择查询中的天数顺序)。顺便说一下,它会更快,因为您可以并行查询多个分区。

轩辕瑞
2023-03-14

最终,您看到的是当前订单,因为您没有使用<code>WHERE</code>子句。如果在分区键上使用标记函数,您可以看到发生了什么:

aploetz@cqlsh:stackoverflow> SELECT idt_day,tsp_insert,token(idt_day),txt_name FROM mytable ;

 idt_day  | tsp_insert                      | system.token(idt_day) | txt_name
----------+---------------------------------+-----------------------+----------
 20161028 | 2016-10-28 15:21:09.000000+0000 |    810871225231161248 |     Jean
 20161028 | 2016-10-28 15:21:01.000000+0000 |    810871225231161248 |   Michel
 20161028 | 2016-10-28 15:20:44.000000+0000 |    810871225231161248 |  Quentin
 20161031 | 2016-10-31 09:24:32.000000+0000 |   5928478420752051351 |  Jacquie
 20161031 | 2016-10-31 09:23:32.000000+0000 |   5928478420752051351 |  Gabriel

(5 rows)

卡珊德拉CQL中的结果将总是按照分区键的散列令牌值的顺序返回(可以使用< code>token查看)。在分区键中,您的< code >群集顺序将被强制执行。

这是理解的关键… Cassandra中的结果集排序只能在分区键中强制执行。您无法控制分区键返回的顺序。

简而言之,在您的idt_day上使用WHERE子句,您将看到您期望的顺序。

 类似资料:
  • 使用Spark连接器通过分区键查询cassandra的理想方法是什么。我使用传入键,但这导致cassandra在引擎盖下添加,从而导致超时。 当前设置: 这里是分区(不是主)键,我有一个复合主键,只使用分区键进行查询 更新:是的,我得到了一个异常:

  • 问题内容: 你好,我需要实现一个接收HashMap并按键对它的值进行排序(mergeSort)的方法 (不使用TreeMap,SortedMap或Collections.Sort或使用JAVA Packages中的任何排序解决方案) 。我的问题是处理通配符类型…这是我的实现(由于使用通配符而返回编译错误) 我感谢您的帮助! 问题答案: 像其他评论者一样,我建议您阅读Java中的泛型主题。您在合并中

  • 问题内容: 某些SQL Server允许使用通用语句,例如。我认为这不适用于MySQL,是否有任何这样的解决方法可以跨多个表进行自动选择,还是需要使用查询查询来确定主键? 我一直在解决的方法是在运行查询之前调用。有更有效的方法吗?在选择过程中,MySQL可以确定表的主键吗? 更新: 正如Gordon所指出的那样,通常在MySQL或SQL中没有官方的方式来执行此操作。SAP具有自定义功能。有一些解决

  • 我在我的活动主题文件: 我正在尝试按Desc对产品进行排序,但产品仍然默认排序(ASC)。 如何按描述对它们进行排序?

  • 我正在尝试使用限制查询来限制查询结果。在没有限制的情况下,查询按预期工作。 但当我尝试使用limit(记录数)来限制记录时,如下所示:, 从上面的查询中,我得到了以下错误, 如何在spring data jpa查询中使用order by limit查询?

  • node-cassandra-cql 是一个 Apache Cassandra CQL3 二进制协议的 Node.js CQL 驱动。CQL 是 Cassandra 的查询语言。该项目提供到多个主机的连接池、查询参数,以及可通过列名获取数值和支持 bigint。 示例代码: // Creating a new connection pool to multiple hosts.var cql =