CQL3现在需要Cassandra的模式吗



上周我刚上了一堂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也应该这么做:(我现在需要调查一下。谢谢院长

最新更新