cassandra大分区和重复数据消除

qojgxg4l  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(379)

我有一张table

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

并需要获得独特的歌曲听用户。但有些用户可以生成大分区(超过100.000或100 mb)。
如果在分区键中添加listen\u date(分割大分区),我将无法获得唯一的歌曲,需要在应用程序端使用额外的重复数据消除。它还使分页复杂化。
也许有更有效的解决办法?

c6ubokkw

c6ubokkw1#

我会像这样为你的数据建模;

用户收听的歌曲

用户| id(分区键)|歌曲| id(集群键)|收听|日期

歌曲\按\用户

用户| id(分区|密钥)|宋| id(集群|密钥)
每当您将一个记录插入到“按用户收听的歌曲”表时,请在插入后执行这些操作
按用户查找歌曲;
如果有记录
是的,那就什么也不做
否,按用户向歌曲添加记录
如果要检索唯一的歌曲,请按用户id按用户表读取歌曲
数据的非规范化和复制是cassandra生活中的一个事实。别害怕。https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

mlmc2os5

mlmc2os52#

通过对部分分区键使用consistensy哈希,可以将大分区拆分为多个分区:

CREATE TABLE songs_listenings (
    user_id int,
    song_hash int,
    song text,
    listen_date date,
    PRIMARY KEY (( user_id, song_hash ), song)
);
``` `song_hash` -是基于歌曲文本生成的哈希。要生成这个散列,您需要在应用程序中实现一个一致的散列函数,该函数能够为指定的输入参数(歌曲文本)生成指定范围内的某个数字(单个用户想要的最大分区数)(e、 g.guava java库提供一致的哈希函数)
对于同一首歌有多个列表的情况,一致散列将返回相同的数字,因此它将是相同的分区键,并且每个用户对同一首歌只有一条记录。
但由于每个用户将有多个分区,因此必须执行多个请求才能获取用户的所有数据(迭代所有可能的哈希值)。

相关问题