CQL3现在需要Cassandra的架构吗?

时间:2012-10-09 02:24:28

标签: cassandra cql cql3

我上周刚刚参加了Cassandra的速成课程,从Thrift API到CQL到了SuperColumns,我不应该使用它们和用户复合键。

我现在正在尝试CQL3,看起来我不能再插入未在架构中定义的列,或者看到select *

中的那些列

我是否缺少一些在CQL3中启用此选项的选项,或者它是否希望我定义架构中的每一列(无法实现宽,灵活行,imho的目的)。

4 个答案:

答案 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 Extras

此外,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驱动程序使用主键定义的第一个元素作为行键
  • 复合列用于实现可以在CQL中定义的额外列
  • 建议不要在新设计中使用使用 WITH COMPACT STORAGE ,因为它会修复可能的列数。换句话说,ALTER TABLE ... ADD在这样的表上是不可能的。除非绝对必要,否则就把它留下来。

答案 3 :(得分:0)

有趣的是,我不了解CQL3。在PlayOrm中,想法是它是一个必须定义的“部分”模式,并且在select的WHERE子句中,你只能使用在部分模式中定义的东西但是它返回行的所有数据即使数据也是如此不知道....我希望CQL应该做同样的事情:(我现在需要调查一下。 谢谢, 迪安