9

上周我刚刚参加了 Cassandra 的速成课程,从 Thrift API 到 CQL,再到深入了解 SuperColumns,再到学习我不应该使用它们,而是使用复合键。

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

我是否缺少在 CQL3 中启用此功能的一些选项,或者它是否希望我定义架构中的每一列(违背了宽、灵活行的目的,恕我直言)。

4

4 回答 4

6

是的,CQL3 确实需要在使用前声明列。

但是,您可以根据需要执行任意数量的 ALTER,不会导致锁定或性能损失。

也就是说,您在早期 C* 版本中使用“动态列”的大多数地方都由 C* 1.2 中的 Map 提供更好的服务。

于 2012-10-09T14:26:26.053 回答
5

我建议您使用“WITH COMPACT STORAGE”探索复合列。“COMPACT STORAGE”列族实际上只允许定义键列:

例子:

CREATE TABLE entity_cargo ( entity_id ascii, item_id ascii, qt ascii, PRIMARY KEY (entity_id, item_id) ) WITH COMPACT STORAGE

实际上,当您从 itemid 插入不同的值时,您不会添加带有 entity_id、item_id 和 qt 的行,而是添加带有名称(item_id 内容)和值(qt 内容)的列。所以:

插入entities_cargo (entity_id,item_id,qt) values(100,'oggetto 1',3);

插入entities_cargo (entity_id,item_id,qt) values(100,'oggetto 2',3);

现在,这是您在 CQL3 中看到这些行的方式:

cqlsh:goh_master> select * from entity_cargo where entity_id = 100;

entity_id | item_id | qt

------------+-----------+----

  100 | oggetto 1 |  3

  100 | oggetto 2 |  3

如果您从 cli 检查 tnem,它们会如何:

[default@goh_master] 获取实体货物[100];

=>(列=oggetto 1,值=3,时间戳=1349853780838000)

=>(列=oggetto 2,值=3,时间戳=1349853784172000)

返回 2 个结果。

您可以使用

select * from entity_cargo where entity_id = 100 and item_id = 'oggetto 1';

希望能帮助到你

于 2012-10-10T07:27:47.093 回答
2

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 驱动程序使用主键定义的第一个元素作为行键
  • 复合列用于实现可以在 CQL 中定义的额外列
  • 不建议对新设计使用WITH COMPACT STORAGE ,因为它固定了可能的列数。换句话说, ALTER TABLE ... ADD 在这样的表上是不可能的。除非绝对必要,否则请忽略它。
于 2014-01-15T14:35:21.073 回答
0

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

于 2012-10-09T14:51:26.903 回答