У меня есть таблица cassandra с первичным ключом Timeuuid, и я хотел бы обрабатывать всю таблицу по частям на различных узлах обработки.
Итак, я подумал, что могу разбить обработку, используя minTimeuuid/maxTimeuuid:
- Чтобы начать свою работу, каждый узел должен получить временной диапазон, который они должны получить от Cassandra, запросить его и обработать.
- Плотность данных довольно однородна, поэтому проблем быть не должно.
Что меня смущает, если я сделаю это:
SELECT * FROM myTable
WHERE t > maxTimeuuid('2013-01-01 00:05+0000')
AND t < minTimeuuid('2013-02-02 10:00+0000')
В документации говорится:
В примере min/maxTimeuuid выбираются все строки, в которых столбец timeuuid t строго позже 01:05+0000 2013-01-00, но строго раньше 02-02-2013 10:00+0000. t >= maxTimeuuid('2013-01-01 00:05+0000') не выбирает timeuuid, сгенерированный точно в 2013-01-01 00:05+0000, и по существу эквивалентен t > maxTimeuuid('2013-01 -01 00:05+0000').
Итак, насколько я понимаю, если бы я выбрал диапазон, начинающийся с «2013-02-02 10:00+0000» для следующего фрагмента, я бы пропустил данные, относящиеся именно к этому времени, потому что ни один из них не охватывает эту точную дату.
Хорошо, я понимаю, что из-за способа генерации Timeuuid это маловероятно, но я все еще чувствую себя некомфортно из-за возможности удаления некоторых результатов. После этого можно проверить наличие дубликатов, но это довольно дорогая операция в кластере.
ИЗМЕНИТЬ:
Итак, очевидно, я не могу выполнять запросы диапазона на Timeuuid. Как и просили, вот моя таблица:
CREATE TABLE cgr.reports (
pk_1 text,
pk_2 text,
pk_3 bigint,
pk_4 bigint,
some_data text,
PRIMARY KEY ((pk_1, pk_2, pk_3, pk_4))
);
PK на самом деле не обязательно должен быть совокупностью этих 4, потому что в какой-то момент я понял, что для них не планируется никаких запросов. Именно тогда я подумал, что могу сделать запрос диапазона для Timeuuid, поэтому я подумал, что могу сделать это вместо этого:
CREATE TABLE cgr.reports (
pk_uuid Timeuuid,
data_1 text,
data_2 text,
data_3 bigint,
data_4 bigint,
some_data text,
PRIMARY KEY ((pk_uuid))
);
Что я действительно хочу сделать, так это разделить обработку между различными узлами. Я предполагаю, что способ сделать это - запросить все идентификаторы строк и отправить их фрагменты различным узлам. Я знаю, что это будет работать с текущим объемом, который у меня есть, я просто беспокоюсь о том, что позже, когда он вырастет.
Спасибо за вашу помощь!