【问题标题】:What's the difference between creating a table and creating a columnfamily in Cassandra?在 Cassandra 中创建表和创建列族有什么区别?
【发布时间】:2013-09-20 09:19:57
【问题描述】:

我需要性能和查询方面的详细信息,我从 some 网站了解到,使用列族时只能给出一个键,如果是这样,你对我的键空间有什么建议,我需要使用 group by、order by、count、sum、ifnull、concat、joins 和有时嵌套查询。

【问题讨论】:

    标签: cassandra cassandra-cli


    【解决方案1】:

    回答您提出的原始问题:列族和表是一回事。

    • 旧的Thrift API 使用了名称“列族”。
    • 在较新的CQL API 中使用了名称“table”。

    可在此处找到有关 API 的更多信息: http://wiki.apache.org/cassandra/API

    如果您需要按照您的说明使用“group by,order by,count,sum,ifnull,concat,joins 和某些时候嵌套查询”,那么您可能不想使用 Cassandra,因为它不支持其中的大多数。

    CQL 支持COUNT,但最多只能支持 10000。它支持ORDER BY,但仅限于集群键。您提到的其他内容根本不支持。

    【讨论】:

    • 严格来说,count 最多支持 10,000 个,这并不完全正确。它可以达到查询限制(默认为 10,000,但可以显式定义)。话虽如此,出于性能原因,您可能不应该使用它。
    • 嗨,我引用了这个链接maxgrinev.com/2010/07/12/…,但是 group by 在 cqlsh 中对我来说是错误的>select count(*) from event_log group by date;我了解到在 cassandra 中插入数据很多比mysql更禁食是这样吗?
    • 那是因为group by 不是有效的CQL。您不能只运行随机 SQL 语句并期望它们正常工作。
    • @Aurand 在对 Cassandra 模型进行了很长时间的理解之后,我们最终确定使用弹性搜索(lucene)作为我所有聚合函数的二级存储级别,按函数分组和排序。仍然嵌套查询在 ES 中不支持太多,可以在我的生产中使用。
    • 链接失效:Thrift API、CQL API、wiki.apache.org/cassandra/API。一些可能的新的:CQL Syntax, Drivers API
    【解决方案2】:

    参考文档:https://cassandra.apache.org/doc/old/CQL-3.0.html

    它指定 CQL 的 LRM 在任何支持 COLUMNFAMILY 的地方都支持 TABLE 关键字。

    这证明了 TABLE 和 COLUMFAMILY 是同义词。

    【讨论】:

      【解决方案3】:

      在 cassandra 中,table 和 columnfamily 没有区别。它们是一个概念。

      【讨论】:

        【解决方案4】:

        对于 Cassandra 3+ 和 cqlsh 5.0.1

        要验证,请在键空间 (ksp) 中输入 cqlsh 提示:

        CREATE COLUMNFAMILY myTable (
             ...  id text,
             ...  name int
        );
        
        

        然后输入“desc myTable”。
        你会看到:

        CREATE TABLE ksp.myTable (
              ...  id text,
              ...  name int
        );
        
        

        它们是同义词,Cassandra默认使用table。

        【讨论】:

          【解决方案5】:

          这里是理解概念的小例子。 键空间是一个包含列族、用户定义类型的对象。

          创建键空间大学 复制={'class':SimpleStrategy, 'replication_factor': 3};

          创建表 University.student(roll int Primary KEY, 部门文本, 名称文本, 学期 in)

          'Create table',表'Student'将在键空间'University'中创建,列RollNo、Name和dept。 RollNo 是主键。 RollNo 也是一个分区键。 所有数据都将在单个分区中。

          在 Cassandra 中更改 Keyspace 时的关键方面

          键空间名称:在 Cassandra 中无法更改键空间名称。

          策略名称:可以通过指定新策略名称来更改策略名称。

          复制因子:复制因子可以通过指定新的复制因子来改变。 DURABLE_WRITES:DURABLE_WRITES 值可以通过指定其值 true/false 来更改。默认情况下,它是真的。如果设置为 false,则不会将任何更新写入提交日志,反之亦然。

          执行:这是执行命令“Alter Keyspace”的快照,该命令将键空间策略从“SimpleStrategy”更改为“NetworkTopologyStrategy”,并将 DataCenter1 的复制因子从 3 更改为 1。

          【讨论】:

            【解决方案6】:

            列族与关系型数据库的表有些关联,存在分布差异,甚至可能是理想主义的特征。

            想象您有一个可能包含 15 列的用户实体,在一个关系数据库中,您可能希望将这些列划分为我们都知道的基于小相关列的结构体表。在 Cassandra 等分布式数据库中,您将能够将所有这些表条目连接到一个长行中,因此如果您使用分析器/数据库管理器,您将看到一个包含 15 列而不是 2/3 个表的表。另一个有趣的事情是,每个列族都被写入不同的节点,可能在不同的集群上并被行键识别,这意味着您将拥有所有列族的单个键,并且不需要维护 PK 或对每个表进行 FK,并通过 1-1、1-n、nn 关系维护它们之间的关系。简单!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-01-26
              • 2012-03-24
              • 2017-07-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-06
              相关资源
              最近更新 更多