我有张桌子
CREATE TABLE user_songs (user_id int, song text, listen_date date, PRIMARY KEY (user_id, song))并需要得到用户独特的听歌。但是一些用户可以生成大分区 (超过100.000或100 MB)。
如果将listen_date添加到分区键(拆分大分区),我无法获得唯一的歌曲,需要在应用程序端使用额外的去重复。此外,它还使分页工作复杂化。
也许有更有效的解决方案?
发布于 2019-05-21 11:10:05
通过对部分分区键使用一致性散列,可以将大分区拆分为多个分区:
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库提供一致散列函数)
对于同一首歌曲有多个监听的情况,一致的散列将返回相同的数字,因此它将是相同的分区键,每个用户只有一条相同歌曲的记录。
但是,由于每个用户都有多个分区,因此必须执行多个请求才能获得用户的所有数据(迭代所有可能的哈希值)。
发布于 2019-05-20 14:42:15
我会像这样模拟你的数据;
listened_songs_by_user
User_id(分区密钥)\x{e76f} song_id (聚类键)\ listen_date
songs_by_user
user_id (partition_key) x song_id (clustering_key)
每当您向listened_songs_by_user表插入记录时,请在插入后执行以下操作
如果要检索唯一的歌曲,请通过songs_by_user user_id读取表
数据的非正规化和重复是卡桑德拉生活中的一个事实。别怕。https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling
https://stackoverflow.com/questions/56208827
复制相似问题