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