我运行了你的确切陈述并产生了相同的结果。但我还调整了您的查询来运行token
函数,这就是它产生的结果:
aaron@cqlsh:stackoverflow> select custno,token(custno) from music_library;
custno | system.token(custno)
--------+----------------------
13 | -5034495173465742853
11 | -4156302194539278891
14 | 4279681877540623768
12 | 8582886034424406875
(4 rows)
为什么它会有这样的行为?
简而言之,因为 Cassandra 无法按分区键的值对结果进行排序。
由于您的表有一个主键custno
,您的行按哈希标记值进行分区custno
,并写入负责这些令牌范围的节点。当您在 Cassandra 中运行未绑定查询时(没有WHERE
子句),结果按其分区键的哈希标记值排序返回。
Using ORDER BY
在这里也行不通。ORDER BY
只能对数据进行排序within一个分区,甚至仅在集群键上。为了得到custno
要正确排序值,您将需要找到一个新的分区键,然后指定custno
作为升序方向的聚类键。
编辑20190916-后续澄清
所有列都会发生这种标记化吗?
不会。分区键被散列到令牌中以确定它们在集群中的位置(它们被写入哪个节点)。写入各个列值within一个分区。
我如何将插入的号码与订单一起退回?
您无法在不更改模型的情况下更改此表的顺序。简而言之,您必须找到一种方法来将您期望返回的值(与查询一起)组织在一起(找到另一个分区键)。具体看起来如何取决于您的业务/查询需求。
例如,假设我想跟踪哪些客户购买了特定的音乐专辑。我可能会创建一个如下所示的表:
CREATE TABLE customers_by_album (
album TEXT,
band TEXT,
custno INT,
PRIMARY KEY (album,custno))
WITH CLUSTERING ORDER BY (custno ASC);
插入一些数据后,以下查询返回按以下顺序排序的结果custno
:
aaron@cqlsh:stackoverflow> SELECT album,token(album),band,custno FROM
customers_by_album WHERE album='Moving Pictures';
album | system.token(album) | band | custno
-----------------+---------------------+------+--------
Moving Pictures | 7819329704333693835 | Rush | 11
Moving Pictures | 7819329704333693835 | Rush | 12
Moving Pictures | 7819329704333693835 | Rush | 13
Moving Pictures | 7819329704333693835 | Rush | 14
(4 rows)
这是可行的,因为我正在按分区查询数据(album
),然后我“聚类”custno
它利用磁盘上的排序顺序。这也是数据写入磁盘的顺序,因此 Cassandra 只是按顺序从分区读取数据。
几年前我为 DataStax 写了一篇关于这个主题的文章,它仍然非常相关。如果有机会请读一读:https://www.datastax.com/dev/blog/we-shall-have-order https://www.datastax.com/dev/blog/we-shall-have-order