繁体   English   中英

创建复合列cassandra

[英]Creating composite columns cassandra

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

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

我想念的是什么?

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

有关如何将其转换为存储引擎层的更多信息,请参见这篇文章

我认为您没有做错任何事情。 CLI正在基于类型解析值的字符串,可能使用org.apache.cassandra.db.marshal.AbstractType<T>.fromString() 对于Composite类型,它使用':'作为字段分隔符(不是我见过的文档,但我已经尝试使用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或特定值,这是您在代码中必须要做的。

另外,由于已经将默认验证列为UTF8Type,因此不需要创建CF的column_metadata选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM