2016-10-03 116 views
1

你好,我正在读的令牌功能卡桑德拉文档,了解令牌功能,卡桑德拉

Screenshot of documentation, https://docs.datastax.com/en/cql/3.1/cql/cql_using/paging_c.html

我试图实现一个卡桑德拉表分页,我无法理解的线条突出。该文件讲述了k> 42与toKEN(k)> toKEN(42)之间的区别,但我无法理解“基于令牌的比较”

期待详细解释何时令牌功能WHERE子句的一部分。

回答

8

为了解其中分区它应该放置您的数据,C *对每行的PARTITION KEY进行一些计算。具体而言,在每个节点上,行按照分区程序生成的标记进行排序(每个分区具有按集群键排序的数据)。不同的partitioners执行不同类型的计算。

虽然Murmur3Partitioner计算partion关键的MurmurHashByteOrderedPartitioner使用分区密钥本身的原始数据字节:当您使用Murmur3Partitioner,你的行是按照其哈希排序,而当你使用ByteOrderedPartitioner,您的行按原始值直接排序

举个例子,假设你有一个表是这样的:

CREATE TABLE test (
    username text, 
    ... 
    PRIMARY KEY (username) 
); 

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

现在您可以看到,使用不同分区程序时,按标记排序的存储数据会产生不同的结果。一个SELECT * FROM test;查询将以不同的顺序返回行。如果您的数据已按其原始值排序,您需要以相同的顺序检索该数据,因此当您使用MH3时,顺序与您的数据无关,这可能是(但不应该是)。

回到问题,TOKEN功能允许您直接数据的令牌过滤代替数据的。 documentation说:

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

举个例子,你可以发出:

SELECT * FROM test WHERE TOKEN(username) <= TOKEN('abcf'); 

,你会得到图什么? abcdacbf排!!!这是因为订单有时候很重要......就像您正在尝试执行分页的情况一样,您可以通过任何可用的C *驱动程序(例如Java driver)为您处理哪个

也就是说,对于新簇的建议分区程序是Murmur3Partitioner,您可以检查documentation以了解每个分区程序的优缺点。请注意,分区程序是群集范围内的设置,一旦设置,您无法在不将所有数据都推送到另一个群集的情况下进行更改。

请谨慎选择。

+0

绝对是我正在寻找的答案 –

+0

节点和分区的排序顺序有什么不同。我相信一个表的每个分区都有一个专用节点 –

2

卡桑德拉数据根据行PartitionKeyToken分区。 token使用散列函数进行gerenated。函数Token生成通过将散列函数应用于其参数而创建的值。

这就是说,几乎所有的驱动程序现在默认自动页面。