在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'
我在这里想念什么?
最佳答案
在Datastax博客上有一篇很好的关于此的博客文章:http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
答案是,是的,CQL3支持动态列,只是不支持它在早期版本的CQL中的工作方式。我不太了解您的示例,您将datetamp与字符串混合使用的方式也看不到它在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无法强制执行此限制,因此,如果添加的元素过多,则以后可能无法读取它们。集合大部分是针对小的多值字段的-典范示例是通讯录,其中每一行都是一个条目,并且条目仅具有一个名称,但是具有多个电话号码,电子邮件地址等。
关于cassandra - 使用CQL3在Cassandra中插入任意列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17439179/