理解Cassandra中的令牌功能

Soh*_*han 3 pagination cql cassandra cql3

您好我正在阅读关于令牌功能的Cassandra文档,

文档的屏幕截图,https://docs.datastax.com/en/cql/3.1/cql/cql_using/paging_c.html

我正在尝试为Cassandra表实现分页,我无法理解突出显示的行.该文件谈到了k> 42和TOKEN(k)> TOKEN(42)之间的区别,但我无法理解"基于令牌的比较"

期待详细解释WHERE子句的一部分时令牌函数的作用.

xma*_*s79 13

为了理解它应该在哪个分区放置数据,C*PARTITION KEY对每一行的s 进行一些计算.具体来说,在每个节点上,行按分区程序生成的令牌排序(并且每个分区都有按群集键排序的数据).不同的分区器执行不同类型的计算.

Murmur3Partitioner计算部分密钥的MurmurHash时,ByteOrderedPartitioner使用分区密钥本身的原始数据字节:当您使用Murmur3Partitioner时,您的行按其哈希值排序,而当您使用ByteOrderedPartitioner时,您的行直接排序按原始价值计算.

例如,假设您有一个这样的表:

CREATE TABLE test (
    username text,
    ...
    PRIMARY KEY (username)
);
Run Code Online (Sandbox Code Playgroud)

而假设你试图找到其中对应于用户名的行abcdabceabcf存储.这些字符串的十六进制表示是0x616263640x616263650x61626366分别.假设我们将此MH3两个字符串,我们得到实现(86,32位为简单起见,没有可选的种子)?0x?43ED676A??0x??E297E8AA??0x??87E62668??分别.因此,在MH3的情况下,字符串的标记将是这3个值,而在BOP的情况下,标记将是原始数据值本身:0x61626364,0x616263650x61626366.

现在您可以看到,当使用不同的分区器时,按令牌排序的存储数据会产生不同的结果.一个SELECT * FROM test;查询将在不同的顺序返回行.如果您的数据已按其原始值排序,并且您需要以相同的顺序检索数据,这可能(但不应该)成为问题,因为当您使用MH3时,订单与您的数据无关.

回到问题,该TOKEN功能允许您直接通过数据令牌而不是数据进行过滤.该文件说:

使用TOKEN功能进行排序并不总能提供预期的结果.使用TOKEN函数在分区键列上表示条件关系.在这种情况下,查询将根据分区键的标记而不是值返回行.

例如,您可以发出:

SELECT * FROM test WHERE TOKEN(username) <= TOKEN('abcf');
Run Code Online (Sandbox Code Playgroud)

你会明白什么?abcdacbf行!这是因为顺序有时很重要......就像你正在尝试做的分页一样,任何可用的C*驱动程序(例如Java驱动程序)都会为你提供完美的处理.

也就是说,新簇的推荐分区是Murmur3Partitioner,您可以查看文档,了解每个分区的优缺点.请注意,分区程序是群集范围的设置,一旦设置,您无法在不将所有数据推送到另一个群集的情况下进行更改.

仔细做出选择.