2

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

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

我错过了什么?

4

2 回答 2

2

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

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

于 2012-07-13T16:33:54.220 回答
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-07-16T21:29:21.863 回答