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

3

我的Cassandra ColumnFamily使用Murmur3Partitioner,并且有一个复合分区键。 使用这个分区器,我试图创建一个Token,但是似乎这个token工厂只允许Long值。 是否有可能为"token(partition_column1, partition_column2)"这样的东西生成这些哈希值?

3个回答

7

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

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)

没错,以上所有陈述都是正确的。然而,我正在寻找使用Java API创建此类令牌的方法,而不是执行查询,即使用org.apache.cassandra.dht.Murmur3Partitioner生成可能的令牌范围。 - user3507166
如果您想使用Java API创建它,您将需要使用partitioner.getToken(ByteBuffer) API。有关详细信息,您可以开始查看CQL token()函数的实现,网址为https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/cql3/functions/TokenFct.java。 - Daniel S.

1
这是我在Datastax网站上找到的计算哈希值的公式:
(((2**64 / number_of_tokens) * i) - 2**63) for i in range(number_of_tokens)

这个哈希函数会创建一个64位的哈希值,用于分区键。
因此,哈希值的范围可以在-2^63到+2^63-12的63次方)之间。

0

计算复合分区键令牌的算法:

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 变体)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接