我上周刚刚参加了Cassandra的速成课程,从Thrift API到CQL到了SuperColumns,我不应该使用它们和用户复合键。
我现在正在尝试CQL3,看起来我不能再插入未在架构中定义的列,或者看到select *
我是否缺少一些在CQL3中启用此选项的选项,或者它是否希望我定义架构中的每一列(无法实现宽,灵活行,imho的目的)。
答案 0 :(得分:6)
是的,CQL3确实要求在使用之前声明列。
但是,您可以根据需要执行任意数量的ALTER,不会导致锁定或性能损失。
也就是说,在C * 1.2中,大多数你在早期C *版本中使用“动态列”的地方都可以通过C * 1.2中的Map更好地服务。
答案 1 :(得分:5)
我建议您使用“WITH COMPACT STORAGE”来探索复合列。 “COMPACT STORAGE”列系列允许您实际上仅定义键列:
示例:
CREATE TABLE entities_cargo( entity_id ascii, item_id ascii, qt ascii, PRIMARY KEY(entity_id,item_id) )具有紧凑的存储
实际上,当您从itemid插入不同的值时,不要添加包含entity_id,item_id和qt的行,但是添加一个名称(item_id内容)和值(qt内容)的列。 所以:
插入entities_cargo(entity_id,item_id,qt)值(100,'oggetto 1',3);
插入entities_cargo(entity_id,item_id,qt)值(100,'oggetto 2',3);
现在,您可以在CQL3中看到这些行:
cqlsh:goh_master> select * from entities_cargo,其中entity_id = 100;
entity_id | item_id | QT
----------- ----------- + + ----
100 | oggetto 1 | 3 100 | oggetto 2 | 3
如果你从cli检查tnem它们是怎么回事:
[default @ goh_master] get entities_cargo [100];
=> (column = oggetto 1,value = 3,timestamp = 1349853780838000)
=> (column = oggetto 2,value = 3,timestamp = 1349853784172000)
返回2个结果。
您可以使用
访问单个列从entities_cargo中选择*,其中entity_id = 100,item_id ='oggetto 1';
希望有所帮助
答案 2 :(得分:2)
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还可以为行id,列和值元素分配标签,以指示存储的内容。以下在CQL中定义相同结构的替代方法突出显示了DataStax示例中的此功能 - 用于存储用户在网站上点击的列系列,按时间排序:
CREATE TABLE clicks (
user_id text,
time timestamp,
url text,
PRIMARY KEY (user_id, time)
) WITH COMPACT STORAGE
备注强>
答案 3 :(得分:0)