Кассандра большие перегородки и дедупликация - PullRequest
1 голос
/ 19 мая 2019

У меня есть таблица

CREATE TABLE user_songs (user_id int, song text, listen_date date, PRIMARY KEY (user_id, song))

, и мне нужно получить уникальные прослушиваемые песни пользователя.Но некоторые пользователи могут создавать больших разделов (более 100 000 или 100 МБ).

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

Может быть, есть более эффективное решение?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

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

CREATE TABLE songs_listenings (
    user_id int,
    song_hash int,
    song text,
    listen_date date,
    PRIMARY KEY (( user_id, song_hash ), song)
);

song_hash - это хеш, который генерируется на основе текста песни. Чтобы сгенерировать этот хеш, вам нужно внедрить в ваше приложение функцию согласованного хеширования, которая предоставит возможность генерировать некоторое число в указанном диапазоне (максимальное количество разделов, которое вы хотите иметь для одного пользователя) для указанного входного параметра (текст песни) , (Например, Java-библиотека Guava обеспечивает согласованную функцию хеширования )

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

Но из-за того, что у вас будет несколько разделов на пользователя, вам придется выполнить несколько запросов, чтобы получить все данные для пользователя (перебрать все возможные значения хеша).

1 голос
/ 20 мая 2019

Я бы смоделировал ваши данные следующим образом;

listened_songs_by_user

user_id (ключ раздела) |song_id (ключ кластеризации) |listen_date

songs_by_user

user_id (partition_key) |song_id (clustering_key)

Всякий раз, когда вы вставляете запись в таблицу listened_songs_by_user, делайте это после вставки

  • lookup songs_by_user;
  • если есть запись
    • Да, тогда ничего не делать
    • Нет, добавить запись к songs_by_user

Если вы хотите получить уникальные песни, прочитайте таблицу songs_by_user от user_id

Денормализация и дублирование данных - это факт жизни Кассандры.Не бойся этого.https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...