gpt4 book ai didi

cassandra - Cassandra CQL 中的字符串排序

转载 作者:行者123 更新时间:2023-12-02 23:23:26 27 4
gpt4 key购买 nike

在 Cassandra CQL 中查询文本主键时,字符串比较的工作方式与预期相反,即

cqlsh:test> select * from sl; name                     | data--------------------------+------ 000000020000000000000003 | null 000000010000000000000005 | null 000000010000000000000003 | null 000000010000000000000002 | null 000000010000000000000001 | nullcqlsh:test> select name from sl where token(name) < token('000000010000000000000005');name-------------------------- 000000020000000000000003(1 rows)cqlsh:test> select name from sl where token(name) > token('000000010000000000000005'); name-------------------------- 000000010000000000000003 000000010000000000000002 000000010000000000000001(3 rows)

In constrast, this is what I get from the string comparison in Python (and I think in most other languages):

>>>'000000020000000000000003' < '000000010000000000000005'
False

如果我在没有 token 函数的情况下进行查询,则会收到以下错误:

cqlsh:test> select name from sl where name < '000000010000000000000005';Bad Request: Only EQ and IN relation are supported on the partition key (unless you use the token() function)

The table description is:

CREATE TABLE sl (
name text,
data blob,
PRIMARY KEY (name)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};

我错过的文档或其他地方是否有解释为什么选择如此奇怪的字符串比较顺序,或者字符串比较运算符是否不符合我的预期(即返回一些不相关的顺序,即行写入数据库时​​的顺序)。我正在使用 Murmur3Partitioner 分区程序,以防万一。

最佳答案

在 Cassandra 中,行按其键值的哈希值排序。对于 Random 和 Murmur3 分区器,哈希值中有一个随机元素,因此顺序 A) 没有意义,B) 设计为均匀分布在环上。

因此,查询小于 token('000000010000000000000005') 的标记不会根据字符串值“000000010000000000000005”进行比较。它将对哈希 token 值进行比较。根据您看到的结果,字符串“000000020000000000000003”的标记值小于“000000010000000000000005”的标记值。

有关详细信息,请查看 DataStax 中的此文档:Paging Through Unordered Partitioner Results .

假设您希望能够通过“name”的值查询数据,您可以构建一个如下所示的表:

CREATE TABLE sl (
type text,
name text,
data blob,
PRIMARY KEY (type, name)
)

我创建了 type 作为分区键。我不确定你的数据是否有意义除以“类型”(或其他任何与此相关的东西),所以它更多的是为了举例而不是其他任何东西。无论如何,使用 name 作为集群键(确定磁盘上的排序顺序),此查询将起作用:

select * from sl where type='sometype' AND name < '000000010000000000000005';

这只是一个例子,但我希望这有助于为您指明正确的方向。

关于cassandra - Cassandra CQL 中的字符串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com