如何为复合分区键生成Cassandra Token?

时间:2014-04-07 14:24:56

标签: cassandra murmurhash

我的Cassandra ColumnFamily使用Murmur3Partitioner,并具有复合分区键。 有了这个分区,我试图创建一个令牌,但似乎这个令牌工厂只允许Long值。 是否可以为“token(partition_column1,partition_column2)”之类的内容生成这些哈希值?

3 个答案:

答案 0 :(得分:6)

它应该有效。实际上,如果您的分区键是复合键,则应该无法仅为单个列创建令牌。您确定已正确定义了复合键吗?

cqlsh:testks> create table t1(k1 int, k2 text, v text, primary key((k1, k2)));
cqlsh:testks> insert into t1(k1, k2, v) values (1, 'key', 'value');
cqlsh:testks> select * from t1;

 k1 | k2  | v
----+-----+-------
  1 | key | value

(1 rows)

cqlsh:testks> select token(k1) from t1;
Bad Request: Invalid number of arguments in call to function token: 2 required but 1 provided
cqlsh:testks> select token(k2) from t1;
Bad Request: Invalid number of arguments in call to function token: 2 required but 1 provided
cqlsh:testks> select token(k1, k2) from t1;

 token(k1, k2)
---------------------
 8064425790465501062

    (1 rows)

答案 1 :(得分:1)

这是计算哈希的公式,我在Datastax网站上找到了:

(((2**64 / number_of_tokens) * i) - 2**63) for i in range(number_of_tokens)

此哈希函数创建分区键的64位哈希值

因此哈希值可以在 -2 ^ 63 到+ 2 ^ 63-1 2到63 )的范围内< / p>

答案 2 :(得分:0)

计算复合分区键令牌的算法: Primary_key((text,int))->因此,分区键是一个Composite_partition_key(text,int)。

示例:一行包含Composite_partition_key('hello',1)

应用算法:

1-在big-endian(16位)表示中布置复合分区键的组成部分:

first_component ='hello'-> 68 65 6c 6c 6f

sec_component = 1-> 00 00 00 01

68 65 6c 6c 6f 00 00 00 01

2-在每个组件之前添加两个字节的长度

first_component ='hello',长度= 5-> 00 05 68 65 6c 6c 6f

sec_component = 1,因此长度= 4-> 00 04 00 00 00 01

00 05 68 65 6c 6c 6f 00 04 00 01

3-在每个组件后添加零值

first_component ='hello'-> 00 05 68 65 6c 6c 6f 00

sec_component = 1-> 00 04 00 00 00 01 00

4个结果

00 05 68 65 6c 6c 6f 00 00 04 00 00 00 01 00

现在将结果作为murmur3函数可以理解的二进制基础(确保它是cassandra变体)传递。