【问题标题】:Cassandra compact storage option with compound keys带有复合键的 Cassandra 紧凑型存储选项
【发布时间】:2015-05-02 17:36:52
【问题描述】:

紧凑型存储在有如下表格的情况下如何工作:

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

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

【问题讨论】:

    标签: cassandra composite-key


    【解决方案1】:

    为了测试这一点,我使用上述 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 列名不会出现,而是仅显示具有相应列键的值。

    【讨论】:

    • 非常感谢您的回答,但现在我完全糊涂了。为什么你最后只有 3 行?让我们考虑一个没有分数列的更简单的情况。用户应该保留包含给定关键字的文件标识......在这种情况下,关键字可能包含在数百个文件中。那么你会再次以一行 CQL 结束吗??
    • @user3201666 已编辑。但是,是的,如果您删除了 score 列,那么这 6 个 INSERT 将只产生一个 CQL 行。正如我在上面添加的,您可能希望将 fID 添加为 PRIMARY KEY 的最后一部分,以确保唯一性。
    • 感谢@BryceAtNetwork23。我需要为相同的 user_id、关键字和分数保留许多 fID。什么是最节省内存的方法?宽行?将 fID 添加到复合索引?真的需要弄清楚这一点..关键是我也不能使用列表,因为fID的数量可能超过限制655536
    • @user3201666 我会选择PRIMARY KEY (userid, keyword, score, fID),它将以userid分区的宽行格式存储您的数据。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多