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如何将多列主键映射到存储层的信息,请参阅。