В нашем наборе данных много повторяющихся ключей разделов.Мы используем метод TOKEN для разбивки данных на страницы.Если строки с дублирующимися ключами разбиты по странице, мы не получим остаток дубликатов при следующем вызове.
Например, предположим, что у нас есть следующие ключи: 1 2 3 5 5 5 6 78 и у нас есть ограничение в 5 строк на запрос.Первый запрос " select * from table, где TOKEN (id)> TOKEN ('') limit 5; " возвращает 1 2 3 5 5, как и ожидалось.Второй запрос " select * from table, где TOKEN (id)> TOKEN ('5') limit 5; " возвращает 6 7 8. Это не желаемое поведение, мы хотим, чтобы второй запрос возвратил 56 7 8. Размышляя об этом, становится очевидным, почему это происходит: « (TOKEN (id)> TOKEN ('5') » завершается неудачей, если id == 5
Мы делаемчто-то не так или это так, как он работает? Мы используем последнюю версию драйвера Java, но я не думаю, что это проблема с драйвером, поскольку драйвер Golang также демонстрирует такое поведение
У нас (в основном)Обойти эту проблему можно, либо удалив все дублированные записи в конце набора строк (в примере 5 5), либо сбросив последнюю запись (чтобы охватить случай, когда последняя запись дублируется во втором наборе записей).если набор записей - все дубликаты. Очевидно, что более высокие ограничения уменьшают этот крайний случай, но это не кажется безопасным для использования в производственной среде.
* РЕДАКТИРОВАНИЕ *
Метод TOKEN рекомендуется во многих случаях.f страницы как здесь, в Stackoverflow, так и в других местах в Интернете.Но, очевидно, это не сработает: - (
@ alex:
Спасибо за ваш ответ. Это был просто упрощенный пример проблемы. На самом деле у нас 30 миллионов строки используем предел в 1000. Когда таблица была впервые разработана несколько лет назад, разработчик не понимал, как работает ключ раздела, поэтому он использовал идентификатор пользователя в качестве раздела, что дает нам 30 миллионов разделов. Мы считаем, что это по крайней мереЭто позволяет нам сократить время восстановления (в настоящее время для кластера 12 часов). Чтобы решить проблему с ключом раздела, нам нужно скопировать всю таблицу в новую с другим ключом раздела (в рабочей среде). Эта страница https://docs.datastax.com/en/developer/java-driver/2.1/manual/paging/ кажется лучшим решением.
@ Nadav:
Спасибо за ваш ответ. Простое удаление ограничения приведет к превышению времени ожидания запроса в нескольких слоях нашего программного обеспечения.Страница DataStax, представленная выше, кажется нам лучшим решением.