在Cassandra中模拟我的分析的正确方法(视频视图)

时间:2017-03-25 16:34:56

标签: cassandra cql modeling

我们(可能)会有一个包含3个字段的表

view_id string  (uuid)
video_id uint (this is a mysql id we use to track what video was viewed)
local    string (this is the location the video was viewed from)

我的问题是,将每个视图存储为单个记录会更好,或者我应该将每个视图存储在一个带有视频ID的记录中的集合中。

部分视频获得500k +视图 - 许多视频每天获得5-10k。

我们需要运行的查询是以非专业术语开发的

// Heres a video ID, where is it popular
// Heres a video ID, get all views
// Get all videos where local is some local

1 个答案:

答案 0 :(得分:0)

收集用于少量数据 收集限制:

  • Collection(List):collection collection:2B(2 ^ 31);值大小:65535(2 ^ 16-1)(Cassandra 2.1及更高版本,使用本机协议v3)

  • Collection(Set):collection collection:2B(2 ^ 31);值大小:65535(2 ^ 16-1)(Cassandra 2.1及更高版本,使用本机协议v3)

  • 收藏(地图):收藏规模:2B(2 ^ 31);键数:65535(2 ^ 16-1);值大小:65535(2 ^ 16-1)(Cassandra 2.1及更高版本,使用本机协议v3)

此外,您无法翻阅收藏品。

来源:https://docs.datastax.com/en/cql/3.1/cql/cql_reference/refLimits.html

最好将每个视图存储为单独的记录,如:

CREATE TABLE views (
    video_id bigint,
    view_id uuid,
    local text,
    PRIMARY KEY(video_id, view_id)
);

CREATE TABLE videobylocal (
    local text,
    video_id bigint,
    PRIMARY KEY(local, video_id)
);

所以要获取视频的所有视图:

SELECT * FROM views WHERE video_id = ?

要从某个位置获取所有视频:

SELECT * FROM videobylocal WHERE local = ?

要获得热门视频,您必须使用Spark / Hadoop或编写自己的程序来计算受欢迎程度。