我的Cassandra ColumnFamily使用Murmur3Partitioner,并且有一个复合分区键。 使用这个分区器,我试图创建一个Token,但是似乎这个token工厂只允许Long值。 是否有可能为"token(partition_column1, partition_column2)"这样的东西生成这些哈希值?
我的Cassandra ColumnFamily使用Murmur3Partitioner,并且有一个复合分区键。 使用这个分区器,我试图创建一个Token,但是似乎这个token工厂只允许Long值。 是否有可能为"token(partition_column1, partition_column2)"这样的东西生成这些哈希值?
它应该是可以工作的。实际上,如果您的分区键是复合的,您应该无法仅为单个列创建令牌。您确定已正确定义复合键吗?
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)
(((2**64 / number_of_tokens) * i) - 2**63) for i in range(number_of_tokens)
计算复合分区键令牌的算法:
Primary_key((text, int)) -> 因此分区键是一个复合分区键(text, int)。
例如:具有复合分区键('hello', 1)的行
应用算法:
1- 以大端(16位)表示法布局复合分区键的组件:
第一个组件='hello' -> 68 65 6c 6c 6f
第二个组件=1 -> 00 00 00 01
68 65 6c 6c 6f 00 00 00 01
2- 在每个组件之前添加两个字节的长度
第一个组件='hello',长度为5-> 00 05 68 65 6c 6c 6f
第二个组件=1,因此长度为4-> 00 04 00 00 00 01
00 05 68 65 6c 6c 6f 00 04 00 01
3- 在每个组件后添加零值
第一个组件 = 'hello' -> 00 05 68 65 6c 6c 6f 00
第二个组件 = 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 变体)。
partitioner.getToken(ByteBuffer)
API。有关详细信息,您可以开始查看CQLtoken()
函数的实现,网址为https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/cql3/functions/TokenFct.java。 - Daniel S.