![](/img/trans.png)
[英]How CRUD operations are possible in Composite columns of a Cassandra Column Family?
[英]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.