Cassandra 2.1: как смоделировать для N самых последних активных пользователей?

Мне нужно получить список из N пользователей с самыми последними действиями с использованием Кассандры.

Я попытался использовать следующую схему:

CREATE TABLE user_actions(
  partition_key int, 
  username int,
  action_time timestamp,
PRIMARY KEY(partition_key, action_time)
WITH CLUSTERING ORDER BY(action_time DESC);

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

Кто-нибудь знает, как лучше всего смоделировать данные, чтобы добиться этого?

1 ответ

Решение

Вам не нужно удалять отдельные ячейки. Просто продолжай добавлять. Добавьте еще один компонент к ключу раздела, чтобы он не стал слишком широким:

PRIMARY KEY((partition_key, day), action_time)

Затем запросите что-то вроде (псевдокод):

y = floor(time() / (60 * 60 * 24))
oldest_possible = y - 7
r = []
while len(r) < N and y >= oldest_possible:
    R.append(query('SELECT * FROM user_actions where partition_key = {x} AND day = {y} LIMIT {N};', x, y, N)
    y -= 1

чтобы получить последние N пользователей. Если в разделе нет N, уменьшите день на 1 и запросите это тоже. Установите TTL от 1 до 5 дней или около того, и старые записи будут сжаты. Это предполагает, что у вас есть как минимум N действий в течение 24 часов, иначе вы можете получить не полный список. Если ваши записи очень активны, можете использовать hour вместо дня.

Компонент день / час может быть просто floor(time() / (60*60*24))

Другие вопросы по тегам