在CQL3之前,可以插入任意列,例如由日期命名的列:
cqlsh:test>CREATE TABLE seen_ships (day text PRIMARY KEY)
WITH comparator=timestamp AND default_validation=text;
cqlsh:test>INSERT INTO seen_ships (day, '2013-02-02 00:08:22')
VALUES ('Tuesday', 'Sunrise');
Per this post CQL3似乎有所不同。是否仍然可以插入任意列?这是我失败的尝试:
cqlsh:test>CREATE TABLE seen_ships (
day text,
time_seen timestamp,
shipname text,
PRIMARY KEY (day, time_seen)
);
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');
我在这里得到Bad Request: line 1:29 no viable alternative at input 'foo'
所以我尝试了一个稍微不同的表,因为这可能是复合键的限制:
cqlsh:test>CREATE TABLE seen_ships ( day text PRIMARY KEY );
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');
再次使用Bad Request: line 1:29 no viable alternative at input 'foo'
我在这里缺少什么?
答案 0 :(得分:16)
在Datastax博客上发布了一篇关于此问题的好文章:http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
答案是肯定的,CQL3支持动态列,而不是它在早期版本的CQL中的工作方式。我真的不明白你的例子,你将日期戳与字符串混合在一起我不知道它在CQL2中是如何工作的。如果我理解正确你想要制作船舶目击的时间表,那么分区键(行键)就是当天,每个目击都是一个时间/名称对。这是一个建议:
CREATE TABLE ship_sightings (
day TEXT,
time TIMESTAMP,
ship TEXT,
PRIMARY KEY (day, time)
)
然后使用
插入条目INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic')
但是,您应该使用TIMEUUID
代替TIMESTAMP
(并且主键可以是DATE
),否则您可能会添加两个具有相同时间戳的目击,并且仅一个人会活下来。
这是一个宽行的例子,但是那时存在动态列的问题,这不是完全相同的事情。以下是CQL3中的一个示例:
CREATE TABLE ship_sightings_with_properties (
day TEXT,
time TIMEUUID,
ship TEXT,
property TEXT,
value TEXT,
PRIMARY KEY (day, time, ship, property)
)
你可以像这样插入:
INSERT INTO ship_sightings_with_properties (day, time, ship, property, value)
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black')
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't
# supported, but I've not included them here to make this example shorter
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith')
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on')
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic')
这种动态列的缺点是属性名称将被存储多次(因此,如果你连续观察了一千个并且每个都有一个名为“Captain”的属性,那么该字符串将被保存一千次) 。磁盘上的压缩消除了大部分开销,而且大部分时间都没有什么可担心的。
最后关于CQL3中的集合的注释。它们是一个有用的功能,但它们不是实现宽行或动态列的方法。首先,他们有65536项限制,但Cassandra无法强制执行此限制,因此如果添加太多元素,您可能无法在以后阅读它们。集合主要用于小型多值字段 - 规范示例是一个地址簿,其中每一行都是一个条目,条目只有一个名称,但有多个电话号码,电子邮件地址等。
答案 1 :(得分:0)
这不是真正的动态专栏,但大多数时候你都可以逃避收藏。使用Map列可以存储一些动态数据