首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卡桑德拉大分区和去重叠

卡桑德拉大分区和去重叠
EN

Stack Overflow用户
提问于 2019-05-19 14:36:38
回答 2查看 256关注 0票数 1

我有张桌子

代码语言:javascript
复制
CREATE TABLE user_songs (user_id int, song text, listen_date date, PRIMARY KEY (user_id, song))

并需要得到用户独特的听歌。但是一些用户可以生成大分区 (超过100.000或100 MB)。

如果将listen_date添加到分区键(拆分大分区),我无法获得唯一的歌曲,需要在应用程序端使用额外的去重复。此外,它还使分页工作复杂化。

也许有更有效的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-21 11:10:05

通过对部分分区键使用一致性散列,可以将大分区拆分为多个分区:

代码语言:javascript
复制
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库提供一致散列函数)

对于同一首歌曲有多个监听的情况,一致的散列将返回相同的数字,因此它将是相同的分区键,每个用户只有一条相同歌曲的记录。

但是,由于每个用户都有多个分区,因此必须执行多个请求才能获得用户的所有数据(迭代所有可能的哈希值)。

票数 1
EN

Stack Overflow用户

发布于 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;
  • 如果有记录
    • 是的,那就什么也不做
    • 不,向songs_by_user添加一条记录

如果要检索唯一的歌曲,请通过songs_by_user user_id读取表

数据的非正规化和重复是卡桑德拉生活中的一个事实。别怕。https://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56208827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档