10

在 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');

根据这篇文章,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'

我在这里想念什么?

4

2 回答 2

17

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')

但是,您可能应该使用 aTIMEUUID而不是TIMESTAMP(并且主键可以是 a 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 无法强制执行此限制,因此如果添加太多元素,您以后可能无法读取它们。集合主要用于小型多值字段——典型示例是地址簿,其中每一行都是一个条目,其中条目只有一个名称,但有多个电话号码、电子邮件地址等。

于 2013-07-03T18:33:47.620 回答
0

它不是真正的动态列,但大多数时候您可以摆脱收藏。使用 Map 列,您可能会存储一些动态数据

于 2015-02-28T07:59:00.830 回答