2017-03-25 7 views
0

我々は(潜在的に)各ビューがあるとして、私の質問は、これを格納する方が良いだろうされる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) 

を持つテーブルを持ってしようとしています個々のレコードを保存するか、各ビューを1つのレコード内のコレクションにビデオIDで格納する必要があります。

動画の中には500k以上の視聴回数があります - 多くは1日あたり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 

答えて

0

コレクションは、少量のデータのために使用されて分かりやすく用語です。
コレクション制限:

  • コレクション(リスト):コレクションサイズ:2B(2^31)。値サイズ:65535(2^16-1)(Cassandra 2.1以降、ネイティブプロトコルv3を使用)

  • コレクション(セット):コレクションサイズ: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を使用)

また、コレクションアイテムをページすることもできません。

出典:だから、ビデオのすべてのビューを取得するには

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 = ? 

をそして、すべて取得するにはhttps://docs.datastax.com/en/cql/3.1/cql/cql_reference/refLimits.html

次のように個々のレコードとして各ビューを保存することをお勧めします場所からのビデオ:

SELECT * FROM videobylocal WHERE local = ? 

人気のあるビデオを取得するには、Spark/Hadoopを使用するか、人気度を計算する独自のプログラムを作成する必要があります。

+0

著者はビデオの視聴回数を500k +に求めていますが、すぐにいつでも20億の制限に達しているようですね。また、作成者が(ビューではなく)場所のビデオを必要とする場合、 'views(ローカル)'のインデックスは少し無駄になります。 – starikoff

+0

@starikoffビデオビューが2Bをヒットせず、500kをヒットしたとしましょうそのビデオのすべてのビューを取得するには、1つの選択で500k、項目を選択することは妥当ですか?そして私の答えは –

+0

に更新されました。ページングの議論に同意します。この場合、制限事項の全体が無関係なようです。 btwであり、実際には関連していません.3.1では、コレクション要素サイズの64k制限が[CASSANDRA-10374](https://issues.apache.org/jira/browse/CASSANDRA-10374)で削除されました。 – starikoff

関連する問題