С этой структурой таблицы вы можете выполнить только 2-й запрос - вам просто нужно будет выполнить запросы для каждого отдельного server_id
, лучше всего через асинхронный API.
Для 1-го запроса эта структура таблицы выигралаЭто не работает, поскольку Cassandra для выполнения запроса необходимо знать ключ раздела (server_id
) - в противном случае потребуется полное сканирование, при котором время ожидания истечет, когда в таблице будет достаточно данных.
Для выполнения этого запроса у вас есть несколько вариантов.
Добавьте еще одну таблицу, в которой ключ разделения будет start
, и вы сможете хранить первичные ключи записей в первой таблице.Примерно так:
create table lookup (start bigint, server_id uuid, end bigint,
primary key(start, server_id, end));
для этого потребуется записать данные в 2 таблицы, или вы можете использовать материализованное представление для этой задачи (хотя это может быть проблематично, если вы используете OSS Cassandra, поскольку у него многоошибок там).Но вам нужно быть осторожным с размером раздела для этой таблицы поиска.
Используйте Spark для сканирования таблицы - поскольку у вас start
в качестве первого столбца кластеризации, тогда Spark сможет выполнять предикаты pushdown,и фильтрация произойдет внутри Касасндры.Но это будет гораздо медленнее, чем использование справочной таблицы.
Кроме того, будьте очень осторожны с каплями - Cassandra плохо работает с большими каплями, поэтому если у вас есть капли размером более 1 МБ, вам понадобитсяразделить их на несколько частей или (лучше) сохранить их в файловой системе или другом хранилище, например, S3, и хранить в Cassandra только метаданные.