上周我刚上了一个Cassandra的速成课程,从Thrift API到CQL,再到摸索SuperColumns,再到我不应该使用它们和用户组合键。
我现在正在尝试使用CQL3,但似乎不能再插入未在模式中定义的列,也不能在select *中查看这些列
我是不是错过了在CQL3中启用它的一些选项,或者它希望我定义模式中的每一列(这违背了宽而灵活的行的目的,imho)。
发布于 2012-10-09 22:26:26
是的,CQL3确实需要在使用前声明列。
但是,您可以进行任意多的更改,不会导致锁定或性能影响。
也就是说,在更早的C*版本中使用“动态列”的大多数地方,在C* 1.2中使用Map的效果更好。
发布于 2012-10-10 15:27:47
我建议您使用“使用紧凑存储”来探索复合列。“紧凑存储”列族实际上只允许您定义键列:
示例:
使用紧凑存储创建表entities_cargo (entity_id ascii、item_id ascii、qt ascii、主键( entity_id、item_id) )
实际上,当您插入来自itemid的不同值时,您不会添加包含entity_id、item_id和qt的行,而是添加一个包含name (item_id内容)和value (qt内容)的列。所以:
插入entities_cargo (entity_id,item_id,qt)值(100,'oggetto 1',3);
插入entities_cargo (entity_id,item_id,qt)值(100,'oggetto 2',3);
现在,下面是在CQL3中查看此行的方式:
select cqlsh:goh_master> *
entities_cargo where entity_id = 100;
entity_id | item_id | qt
100 | oggetto 1|3 100 | oggetto 2|3
如果你从cli中检查tnem,它们是怎样的:
default@goh_master get entities_cargo100;
=> (column=oggetto 1、value=3、timestamp=1349853780838000)
=> (column=oggetto 2、value=3、timestamp=1349853784172000)
返回了%2个结果。
您可以使用以下命令访问单个列
select * from entities_cargo where entity_id = 100 item_id = 'oggetto 1';
希望能有所帮助
发布于 2014-01-15 22:35:21
Cassandra仍然允许使用宽行。这个答案引用了在问题提出之后编写的that DataStax blog entry,它详细说明了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中的表始终映射到
https://stackoverflow.com/questions/12792040
复制相似问题