Как сгенерировать токен Cassandra для составного ключа раздела?

Моя семья столбцов Cassandra использует Murmur3Partitioner и имеет составной ключ раздела. С помощью этого разделителя я пытался создать токен, однако кажется, что эта фабрика токенов допускает только длинные значения. Можно ли сгенерировать эти хэши для чего-то вроде «токен (partition_column1, partition_column2)»?


person user3507166    schedule 07.04.2014    source источник


Ответы (3)


Это должно работать. На самом деле, если ваш ключ секции составной, вы не сможете создать токен только для одного столбца. Вы уверены, что правильно определили составной ключ?

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)
person Daniel S.    schedule 07.04.2014
comment
Это верно, все утверждения выше верны. Однако я искал средства для создания такого токена из java API вместо выполнения запросов, т.е. для генерации возможных диапазонов токенов с помощью org.apache.cassandra.dht.Murmur3Partitioner. - person user3507166; 08.04.2014
comment
Если вы хотите создать его с помощью Java API, вам придется использовать partitioner.getToken(ByteBuffer) API. Для получения дополнительной информации вы можете начать изучение реализации функции CQL token() в github.com/apache/cassandra/blob/trunk/src/java/org/apache/ . - person Daniel S.; 08.04.2014

Это формула для расчета хэша, которую я нашел в сети Datastax:

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

Эта хеш-функция создает 64-битное хеш-значение ключа раздела.

Таким образом, хэш может находиться в диапазоне от -2^63 до +2^63-1 (2 в степени 63).

person Himanshu Singh    schedule 07.09.2018

Алгоритм вычисления токена для составного ключа раздела: Primary_key((text, int)) -> поэтому ключ раздела является составным_partition_key (text, int).

Пример: строка с составным_разделом_ключом ("привет", 1)

Применение алгоритма:

1- компоновка компонентов составного ключа раздела в представлении с обратным порядком байтов (16 бит):

first_component = 'привет' -> 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', length= 5-> 00 05 68 65 6c 6c 6f

sec_component = 1, поэтому length= 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).

person aiomix    schedule 29.09.2018