【问题标题】:Creating composite columns cassandra创建复合列 cassandra
【发布时间】:2012-07-12 15:07:19
【问题描述】:

我需要为每个夜间构建存储基准运行。为此,我提出了以下数据模型。

BenchmarkColumnFamily= {

   build_1: {
       (Run1, TPS) : 1000K
       (Run1, Latency) : 0.5ms
       (Run2, TPS) : 1000K
       (Run2, Latency) : 0.5ms
       (Run3, TPS) : 1000K
       (Run3, Latency) : 0.5ms
    }

    build_2: {
       ...
    }
...

}

为了创建这样的架构,我在 cassandra-cli 上提出了以下命令:

create column family BenchmarkColumnFamily with 
    comparator = 'CompositeType(UTF8Type,UTF8Type)' AND 
    key_validation_class=UTF8Type AND
    default_validation_class=UTF8Type AND
    column_metadata = [
    {column_name: TPS, validation_class: UTF8Type}
    {column_name: Latency, validation_class: UTF8Type}
    ];

上述命令是否创建了我打算创建的架构?我感到困惑的原因是,当我使用以下方法将数据插入上述 CF 时: set BenchmarkColumnFamily['1545']['TPS']='100'; 即使比较器类型是复合的,它也会成功插入。此外,即使以下命令也成功执行了

set BenchmarkColumnFamily['1545']['Run1:TPS']='1000';

我错过了什么?

【问题讨论】:

    标签: nosql cassandra hector


    【解决方案1】:

    cassandra-cli 工具在处理复合材料方面非常有限。此外,在 Cassandra 中可能会发生一些关于用户提供的显式组合验证的意外事情。我不知道您的情况的确切答案,但我可以告诉您,您会发现使用 CQL 3 引擎非常更容易使用这种模型。

    例如,您的模型可以表示为:

    CREATE TABLE BenchmarkColumnFamily (
        build text,
        run int,
        tps text,
        latency text,
        PRIMARY KEY (build, run)
    );
    
    INSERT INTO BenchmarkColumnFamily (build, run, tps, latency) VALUES ('1545', 1, '1000', '0.5ms');
    

    请参阅this post,了解有关如何将其转换为存储引擎层的更多信息。

    【讨论】:

    • 我认为这与 OP 的架构不匹配;这将创建一个复合键。详情请参阅this post 中的 cmets。
    • 它创建一个复合 CQL 键,而不是一个复合 Cassandra 键。在存储层,这将像他所拥有的那样创建复合列名称。确实不建议将 Cassandra-cli 用于此类事情。 (那篇文章是在 cql3 出现之前写的。)
    • 好的,谢谢.. 将不得不进一步探索 cql3。诚然,我的大部分工作都在使用 CLI 和/或 Java api。
    • 请参阅here,了解 CQL 如何将多列主键映射到存储层。
    【解决方案2】:

    我不认为你做错了什么。 CLI 正在根据类型解析字符串中的值,可能使用org.apache.cassandra.db.marshal.AbstractType<T>.fromString()。对于复合类型,它使用 ':' 作为字段分隔符(不是我见过的文档,但我已经尝试使用 Java 代码来说服自己。

    如果没有':',它似乎只是设置了 Composite 的第一部分,而将第二部分保留为 null。要设置第二个,您可以使用

    set BenchmarkColumnFamily['1545'][':NOT_TPS']='999';
    

    从 CLI 中转储 CF:

    list BenchmarkColumnFamily;
    

    你应该看到所有的名字(所有的行),例如

    RowKey: 1545
    => (column=:NOT_TPS, value=999, timestamp=1342474086048000)
    => (column=Run1:TPS, value=1000, timestamp=1342474066695000)
    => (column=TPS, value=100, timestamp=1342474057824000)
    

    没有办法(通过 CLI)将复合元素限制为非 null 或特定值,这是您必须在代码中执行的操作。

    另外,创建 CF 的 column_metadata 选项是不必要的,因为您已经将默认验证列为 UTF8Type。

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2016-11-28
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多