了解令牌功能,卡桑德拉
你好,我正在读的令牌功能卡桑德拉文档,了解令牌功能,卡桑德拉
我试图实现一个卡桑德拉表分页,我无法理解的线条突出。该文件讲述了k> 42与toKEN(k)> toKEN(42)之间的区别,但我无法理解“基于令牌的比较”
期待详细解释何时令牌功能WHERE子句的一部分。
为了解其中分区它应该放置您的数据,C *对每行的PARTITION KEY
进行一些计算。具体而言,在每个节点上,行按照分区程序生成的标记进行排序(每个分区具有按集群键排序的数据)。不同的partitioners执行不同类型的计算。
虽然Murmur3Partitioner计算partion关键的MurmurHash的ByteOrderedPartitioner使用分区密钥本身的原始数据字节:当您使用Murmur3Partitioner,你的行是按照其哈希排序,而当你使用ByteOrderedPartitioner,您的行按原始值直接排序。
举个例子,假设你有一个表是这样的:
CREATE TABLE test (
username text,
...
PRIMARY KEY (username)
);
而且假设你试图找到对应的用户名和abcd
和abce
的abcf
行的存储位置。这些字符串的十六进制表示分别为0x61626364
和0x61626365
和0x61626366
。假设我们在这两个字符串上应用了这个MH3实现(x86,32位为了简单起见,没有可选的种子),我们分别得到0x43ED676A
和0xE297E8AA
和0x87E62668
。因此,在MH3的情况下,字符串的标记将是这3个值,而在BOP的情况下,标记本身将是原始数据值:0x61626364
,0x61626365
和0x61626366
。
现在您可以看到,使用不同分区程序时,按标记排序的存储数据会产生不同的结果。一个SELECT * FROM test;
查询将以不同的顺序返回行。如果您的数据已按其原始值和排序,您需要以相同的顺序检索该数据,因此当您使用MH3时,顺序与您的数据无关,这可能是(但不应该是)。
回到问题,TOKEN
功能允许您直接数据的令牌过滤代替数据的。 documentation说:
使用TOKEN函数进行排序并不总是提供预期的 结果。使用TOKEN函数在 分区键列上表达条件关系。在这种情况下,查询将根据分区键的标记而不是该值返回基于 的行。
举个例子,你可以发出:
SELECT * FROM test WHERE TOKEN(username) <= TOKEN('abcf');
,你会得到图什么? abcd
和acbf
排!!!这是因为订单有时候很重要......就像您正在尝试执行分页的情况一样,您可以通过任何可用的C *驱动程序(例如Java driver)为您处理哪个。
也就是说,对于新簇的建议分区程序是Murmur3Partitioner,您可以检查documentation以了解每个分区程序的优缺点。请注意,分区程序是群集范围内的设置,一旦设置,您无法在不将所有数据都推送到另一个群集的情况下进行更改。
请谨慎选择。
卡桑德拉数据根据行PartitionKey
的Token
分区。 token
使用散列函数进行gerenated。函数Token
生成通过将散列函数应用于其参数而创建的值。
这就是说,几乎所有的驱动程序现在默认自动页面。
绝对是我正在寻找的答案 –
节点和分区的排序顺序有什么不同。我相信一个表的每个分区都有一个专用节点 –