Вам нужно будет как-то разделить ваши данные. Если вы этого не сделаете, это будет, как вы говорите, это либо прочитать все из всего кластера (разрешить фильтрацию), либо поместить все в один раздел (постоянный ключ). Не зная ничего о ваших данных, дизайне или целях, обычная установка - это разделить по дате, например:
SELECT id FROM table WHERE bucket = '2018' AND id < 100 limit 1;
Тогда ваш ключ будет выглядеть как ((bucket), id)
упорядоченный идентификатор DESC, столь большой в начале раздела. В этом случае сегменты делятся на год, поэтому в конечном итоге вы делаете запрос в год, который вы ищете. если idt не уникален, вам может потребоваться сделать что-то вроде:
((uuid), idt)
или ((bucket), uuid, idt)
сортировка по IDT DESC (еще раз выдает, если не уникален для этой записи). Тогда вы можете делать такие вещи, как
SELECT max(idt) FROM table WHERE GROUP BY bucket
хотя все же лучше
SELECT max(idt) FROM table WHERE bucket = '2018' GROUP BY bucket
, который даст вам максимум для каждой корзины, так что вам придется пролистывать его и генерировать глобальный максимум самостоятельно, но это лучше для кластера, поскольку он естественным образом ограничивает небольшой запрос по сравнению с одним запросом, отбивающим весь кластер. Может быть хорошей идеей в этом запросе также ограничить размер выборки до 10 или 100 или что-то по сравнению с 5000 по умолчанию, поэтому страницы набора результатов работают медленнее (что предотвращает слишком большую работу с координатором).
Чтобы выполнить всю эту работу где-то еще, вы, возможно, захотите рассмотреть Spark, поскольку он может дать вам гораздо более насыщенные запросы и выполнять их настолько эффективно, насколько это возможно (что может быть неэффективно, но будет пытаться).