Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nosql 创建组合柱cassandra_Nosql_Cassandra_Hector - Fatal编程技术网

Nosql 创建组合柱cassandra

Nosql 创建组合柱cassandra,nosql,cassandra,hector,Nosql,Cassandra,Hector,我需要为每个夜间构建存储基准运行。为此,我提出了以下数据模型 BenchmarkColumnFamily= { build_1: { (Run1, TPS) : 1000K (Run1, Latency) : 0.5ms (Run2, TPS) : 1000K (Run2, Latency) : 0.5ms (Run3, TPS) : 1000K (Run3, Latency) : 0.5ms }

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

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时:
设置BenchmarkColumnFamily['1545']['TPS']='100'
即使比较器类型是复合的,它也会成功插入。此外,即使下面的命令也会成功执行

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

我缺少什么?

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

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

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

有关如何转换到存储引擎层的更多信息,请参阅。

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

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

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.fromString()
分析字符串中基于类型的值。对于复合类型,它使用“:”作为字段分隔符(我并没有看到文档中的分隔符,但我已经用Java代码进行了实验,以说服自己

如果没有“:”,它似乎只设置组合的第一部分,而将第二部分保留为null

set BenchmarkColumnFamily['1545'][':NOT_TPS']='999';
从CLI中转储CF:

list BenchmarkColumnFamily;
您应该看到所有的名称(所有行的名称),例如

无法(通过CLI)将复合元素约束为非null或特定值,这是您必须在代码中执行的操作


此外,由于您已经将默认验证列为UTF8Type,因此CF创建的列元数据选项是不必要的。

我认为您没有做错任何事情。CLI正在根据类型解析字符串中的值,可能使用
org.apache.cassandra.db.marshal.AbstractType.fromString()
。对于复合类型,它使用“:”作为字段分隔符(我没有看到文档中的分隔符,但我已经用Java代码进行了试验,以说服自己

如果没有“:”,它似乎只设置组合的第一部分,而将第二部分保留为null

set BenchmarkColumnFamily['1545'][':NOT_TPS']='999';
从CLI中转储CF:

list BenchmarkColumnFamily;
您应该看到所有的名称(所有行的名称),例如

无法(通过CLI)将复合元素约束为非null或特定值,这是您必须在代码中执行的操作


此外,由于您已经将默认验证列为UTF8Type,因此CF创建的列\u元数据选项是不必要的。

我认为这与OP的架构不匹配;这将创建一个复合键。有关详细信息,请参阅中的注释。它创建一个复合CQL键,而不是复合Cassandra键。在存储层,这将创建一个复合列名就像他拥有的一样。真的不建议使用Cassandra cli来处理这类事情。(这篇文章甚至在cql3出现之前就已经写了。)好的,谢谢。我还需要进一步研究cql3。无可否认,我的大部分工作都在使用CLI和/或Java api。有关CQL如何将多列主键映射到存储层的信息,请参阅。我认为这与OP的架构不匹配;这将创建复合键。有关详细信息,请参阅中的注释。它创建复合CQL键,而不是复合Cassandra key。在存储层,这将创建与他一样的复合列名。不建议使用Cassandra cli进行此类操作。(这篇文章甚至是在cql3出现之前撰写的。)好的,谢谢。我还需要进一步研究cql3。无可否认,我的大部分工作都在使用CLI和/或Java api。有关CQL如何将多列主键映射到存储层的信息,请参阅。