Кассандра использует агрегатную функцию, а затем упорядочивает по этому агрегату - PullRequest
0 голосов
/ 04 октября 2018

У меня есть база данных кассандры с таблицей, имеющей следующие столбцы:

  • itemid
  • идентификатор пользователя
  • рейтинг

itemid и userid являются первичными ключами.Мой запрос выглядит следующим образом:

SELECT itemid, avg(rating) as avgRating from mytable GROUP BY itemid order by avgRating asc;

Я получаю следующую ошибку:

InvalidRequest: ошибка сервера: code = 2200 [Invalid query] message = "ORDER BY is onlyподдерживается, когда ключ раздела ограничен эквалайзером или IN. "

Как это исправить?

Мне нужно упорядочить по среднему рейтингу после того, как я смогу получить10 лучших фильмов на основе их среднего рейтинга.

1 Ответ

0 голосов
/ 05 октября 2018

Кассандра может упорядочивать результаты только путем кластеризации столбцов.Он не может упорядочить результаты с помощью агрегатной функции.

Существует несколько вариантов, которые можно использовать для достижения этой цели.

  1. Выполните запрос, а затем измените порядок результатов.в вашем приложении.

Эта опция может работать, если вы ожидаете, что только ограниченное количество строк будет возвращено из каждого запроса.

Обратите внимание, что рекомендуется использовать агрегатные функции (например, avg ()) только тогда, когда вы знаете, что они будут применяться только к ограниченному числу строк.В идеале вы должны использовать их только при работе с одним разделом (используйте предложение WHERE, чтобы ограничиться одним разделом).Если у вас нет ограничений, вы можете увидеть очень медленные запросы или тайм-ауты запроса, если Cassandra нужно прочитать большое количество строк, чтобы вычислить совокупность.

Сохраните предварительно рассчитанное среднее значение в таблице или кэшируйте его в своем приложении.

Это лучший вариант, если вам нужны вычисленные средние значения для большего набора данных.

Если вы сделаете average_rating столбец кластеризации, Cassandra будет хранить средние значения для каждого раздела в отсортированном порядке.Это очень эффективно с точки зрения Cassandra.

Недостатком является то, что вам нужно будет вычислять среднее значение в вашем приложении каждый раз, когда вы вставляете или обновляете строку, потому что это будет столбец первичного ключа в Cassandra.Таблица.

Одна вещь, на которую вы могли бы обратить внимание - это использовать триггер Кассандры, чтобы вычислить среднее значение для вас.Это может облегчить вам жизнь, если у вас есть несколько приложений, пишущих в эту таблицу, однако я на самом деле не уверен, возможно ли изменить столбец первичного ключа с помощью пользовательского триггера.Я бы порекомендовал провести некоторые исследования и тестирование, если вы решите посмотреть на эту опцию.Вы можете прочитать о триггерах здесь .

...