上周我刚刚参加了 Cassandra 的速成课程,从 Thrift API 到 CQL,再到深入了解 SuperColumns,再到学习我不应该使用它们,而是使用复合键。
我现在正在尝试 CQL3,看来我不能再插入到架构中未定义的列中,或者在select *
我是否缺少在 CQL3 中启用此功能的一些选项,或者它是否希望我定义架构中的每一列(违背了宽、灵活行的目的,恕我直言)。
是的,CQL3 确实需要在使用前声明列。
但是,您可以根据需要执行任意数量的 ALTER,不会导致锁定或性能损失。
也就是说,您在早期 C* 版本中使用“动态列”的大多数地方都由 C* 1.2 中的 Map 提供更好的服务。
我建议您使用“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';
希望能帮助到你
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 提供了为行 id、列和值元素分配标签以指示正在存储的内容的能力。以下在 CQL 中定义相同结构的替代方法突出了 DataStax 示例中的此功能 - 用于存储用户在网站上的点击的列族,按时间排序:
CREATE TABLE clicks (
user_id text,
time timestamp,
url text,
PRIMARY KEY (user_id, time)
) WITH COMPACT STORAGE
笔记
有趣的是,我对 CQL3 不了解。在 PlayOrm 中,想法是它是您必须定义的“部分”模式,并且在 select 的 WHERE 子句中,您只能使用在部分模式中定义的东西,但它返回所有行的数据,甚至是它的数据不知道......我希望CQL应该做同样的事情:(我现在需要调查一下。谢谢,Dean