gpt4 book ai didi

cassandra - 使用 CQL3 在 Cassandra 中插入任意列

转载 作者:行者123 更新时间:2023-12-02 19:19:39 25 4
gpt4 key购买 nike

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

这里我得到错误请求:第1:29行在输入“foo”时没有可行的替代方案

所以我尝试了一个稍微不同的表,因为这可能是复合键的限制:

cqlsh:test>CREATE TABLE seen_ships ( day text PRIMARY KEY );
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

再次出现错误请求:第 1:29 行在输入“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 无法强制执行此限制,因此如果添加太多元素,以后可能无法读回它们。集合主要用于小型多值字段 - 典型的示例是地址簿,其中每一行都是一个条目,并且条目只有一个名称,但有多个电话号码、电子邮件地址等。

关于cassandra - 使用 CQL3 在 Cassandra 中插入任意列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com