【发布时间】:2015-05-02 17:36:52
【问题描述】:
紧凑型存储在有如下表格的情况下如何工作:
Table Index {
userid
keyword
score
fid
PRIMARY KEY (userid, keyword, score)
}
不要注意我表的语法错误:) 假设有一个关键字包含 6 个 fID,分为 3 组不同的分数。 cassandra如何将数据存储在物理层?
【问题讨论】:
紧凑型存储在有如下表格的情况下如何工作:
Table Index {
userid
keyword
score
fid
PRIMARY KEY (userid, keyword, score)
}
不要注意我表的语法错误:) 假设有一个关键字包含 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 stackoverflow;
Authenticated to keyspace: stackoverflow
[default@stackoverflow] 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 列名不会出现,而是仅显示具有相应列键的值。
【讨论】:
score 列,那么这 6 个 INSERT 将只产生一个 CQL 行。正如我在上面添加的,您可能希望将 fID 添加为 PRIMARY KEY 的最后一部分,以确保唯一性。
PRIMARY KEY (userid, keyword, score, fID),它将以userid分区的宽行格式存储您的数据。