带有复合键的 Cassandra 紧凑型存储选项

Cassandra compact storage option with compound keys

紧凑型存储在 table 情况下如何工作:

Table Index {
    userid
    keyword
    score
    fid
    PRIMARY KEY (userid, keyword, score)
}

不要注意我的语法错误table:) 假设有一个关键字包含 6 个 fID,分为 3 组不同的分数。 cassandra如何在物理层存储数据?

为了对此进行测试,我使用上面的 PRIMARY KEY 创建了您的示例模式(使用 WITH COMPACT STORAGE),并且 运行 这 6 个 INSERTs:

INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,1);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,2);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,3);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,4);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,5);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,6);

请注意,由于您的 PRIMARY KEY 定义,我最终得到了这三个 CQL 行:

 userid | keyword      | score | fid
--------+--------------+-------+-----
      3 |    Star Wars |    21 |   4
      3 |    Star Wars |    44 |   6
      3 |    Star Wars |    87 |   2

(3 rows)

Cassandra PRIMARY KEY 的特点是它们是独一无二的。所以如果你想确保唯一性到fID,那么你应该让它成为PRIMARY KEY的最后一部分...... PRIMARY KEY(userid,keyword,score,fID)这将确保唯一性,并且仍然允许你排序按关键字和分数。

要查看它们在物理层面的结构,我可以使用 cassandra-cli(而不是 cqlsh):

[aploetz@unknown] use Whosebug;
Authenticated to keyspace: Whosebug
[default@Whosebug] list dontnameyourtableindex ;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: 3
=> (name=Star Wars:21, value=4, timestamp=1425307959946184)
=> (name=Star Wars:44, value=6, timestamp=1425307961062608)
=> (name=Star Wars:87, value=2, timestamp=1425307959909671)

请注意,WITH COMPACT STORAGE 会阻止 fid 列名称出现,而只会显示具有相应列键的值。