2015-03-02 96 views
1

如何压缩存储工作在情况下,具有如表:与复合键卡桑德拉紧凑的存储选项

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

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

回答

1

为了测试这一点,我创建了上面的PRIMARY KEY的示例模式(使用WITH COMPACT STORAGE),跑这6个INSERT S:

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); 

注意的是,由于您的主键定义,我结束行动与这三个CQL行:

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

(3 rows) 

与Cassandra PRIMARY KEYs的事情是,他们是独特的。所以,如果你想确保唯一性到fID,那么你应该确保它是PRIMARY KEY的最后一部分... PRIMARY KEY(用户标识,关键字,分数,fID)这将确保唯一性,并且仍然允许您对通过关键字和分数。

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

[[email protected]] use stackoverflow; 
Authenticated to keyspace: stackoverflow 
[[email protected]] 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列名,而不是只显示值与相应的列键。

+0

非常感谢您的回答,但现在我完全困惑。为什么你最终只有3行?让我们考虑一个没有列分数的更简单的情况。用户应该保持包含给定关键字的文件标识......在这种情况下,关键字可能包含在数百个文件中。那么你会再次以一个CQL行结束? – user3201666 2015-03-03 14:34:37

+1

@ user3201666编辑。但是,是的,如果您删除了“score”列,那么这6个INSERT只会导致一个CQL行。正如我在上面添加的那样,您可能想要添加'fID'作为PRIMARY KEY的最后一部分,以确保唯一性。 – Aaron 2015-03-03 14:59:35

+0

谢谢@ BryceAtNetwork23。我需要为同一个user_id,关键字和分数保留很多fID。什么是最有效的内存方式?宽行?将fID添加到复合索引?真的需要弄清楚这一点。我的意思是我也不能使用列表作为fID的数量可能会超过限制655536 – user3201666 2015-03-05 13:35:02