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