繁体   English   中英

使用CQL3在Cassandra中插入任意列

[英]Inserting arbitrary columns in Cassandra using CQL3

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

我在这里错过了什么?

在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无法强制执行此限制,因此如果添加太多元素,您可能无法在以后阅读它们。 集合主要用于小型多值字段 - 规范示例是地址簿,其中每行是条目,条目只有一个名称,但有多个电话号码,电子邮件地址等。

它不是真正的动态列,但大多数时候你可以逃避收藏。 使用Map列可以存储一些动态数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM