上周我刚上了一堂Cassandra的速成课程,从Thrift API到CQL,摸索SuperColumns,学习不应该使用它们,而是使用复合键。
我现在正在尝试CQL3,看起来我不能再插入到模式中未定义的列中,也不能在select *
中看到这些列
我是不是错过了在CQL3中启用这一功能的选项,还是希望我定义模式中的每一列(违背了宽、灵活行、imho的目的)。
是的,CQL3确实要求在使用之前声明列。
但是,您可以执行任意数量的ALTER,不需要锁定或性能打击。
也就是说,在早期的C*版本中,大多数使用"动态列"的地方都可以更好地使用C*1.2中的Map。
我建议您使用"with COMPACT STORAGE"来探索复合列。"COMPACT STORAGE"列族实际上只允许您定义关键列:
示例:
CREATE TABLE entities _cargo(entity_id ascii,item_id ascii,qt腹水,PRIMARY KEY(entity_id,item_id))具有紧凑型存储
实际上,当您插入与itemid不同的值时,您不会添加具有entity_id、item_id和qt的行,而是添加具有name(item_id-content)和value(qt-content。因此:
插入entities_cargo(entity_id,item_id,qt)值(100,'ggetto1',3);
在entities _cargo(entity_id,item_id,qt)中插入值(100,'ggetto 2',3);
现在,以下是您如何在CQL3:中看到这些行
cqlsh:goh_master>从entities_cargo中选择*,其中entity_id=100;
entity_id|item_id|qt
-----------+-----------+----
100 | oggetto 1 | 3 100 | oggetto 2 | 3
如果您从cli:检查tnem,它们是如何的
[default@goh_master]获取entities _cargo[100];
=>(列=oggeto 1,值=3,时间戳=1349853780838000)
=>(列=oggeto 2,值=3,时间戳=1349853784172000)
返回2个结果。
您可以使用访问单个列
从entities_cargo中选择*,其中entity_id=100,item_id='oggeto1';
希望它能帮助
Cassandra仍然允许使用宽行。这个答案引用了在提问后写的DataStax博客条目,该条目详细描述了CQL和底层体系结构之间的联系。
遗留支持
通过Thrift使用以下命令定义的动态列族(请注意,没有特定于列的元数据):
create column family clicks
with key_validation_class = UTF8Type
and comparator = DateType
and default_validation_class = UTF8Type
以下是CQL:中的精确等价物
CREATE TABLE clicks (
key text,
column1 timestamp,
value text,
PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE
这两个命令都创建了一个宽行列族,用于存储按日期排序的记录。
CQL附加
此外,CQL提供了将标签分配给行id、列和值元素的能力,以指示正在存储的内容。以下是在CQL中定义相同结构的另一种方法,在DataStax的示例中突出了这一功能——一个用于存储用户在网站上的点击量的列族,按时间排序:
CREATE TABLE clicks (
user_id text,
time timestamp,
url text,
PRIMARY KEY (user_id, time)
) WITH COMPACT STORAGE
票据
- CQL中的表总是映射到Thrift中的列族
- CQL驱动器使用主键定义的第一个元素作为行密钥
- Composite Columns用于实现可以在CQL中定义的额外列
- 对于新设计,不建议使用WITH COMPACT STORAGE,因为它固定了可能的列数。换句话说,ALTER TABLE。。。ADD在这样的表上是不可能的。除非绝对必要,否则就别提了
有趣的是,我对CQL3一无所知。在PlayOrm中,它是一个你必须定义的"部分"模式,在select的WHERE子句中,你只能使用在部分模式中定义的东西,但它会返回行的所有数据,即使是它不知道的数据。。。。我想CQL也应该这么做:(我现在需要调查一下。谢谢院长