如何在Cassandra中定义动态列族

7

这里说,获取动态列族不需要特殊的努力。但是当我尝试为未定义的列设置值时,我总是会遇到异常。

我创建了一个类似于下面的列族:

CREATE TABLE places (
   latitude double,
   longitude double,
   name text,
   tags text,
   PRIMARY KEY (latitude, longitude, name)
)

顺便说一下:我必须定义标签列。有人能解释一下为什么吗?也许是因为所有其他列都是索引的一部分吗?

现在,当像这样插入数据时:

INSERT INTO places ("latitude","longitude","name","tags") VALUES (49.797888,9.934771,'Test','foo,bar')

它工作得很好!但是当我尝试:

INSERT INTO places ("latitude","longitude","name","tags","website") VALUES (49.797888,9.934771,'Test','foo,bar','test.de')

我收到以下错误信息:

我遇到了以下错误:

Bad Request: Unknown identifier website
text could not be lexed at line 1, char 21

我需要哪些更改才能动态添加列呢?

我正在使用Cassandra 1.1.9和CQL3,直接在服务器上使用cqlsh。

2个回答

12

CQL3支持动态列族,但你必须先修改表模式

ALTER TABLE places ADD website varchar;

查看1.2文档深入了解CQL


谢谢!现在我明白了关于宽行的更改!但是我不喜欢它们,但你帮了我很多。 - Balo
2
嗨,我有点困惑,有没有办法动态创建一列? - Jisson

7

CQL3需要存在列元数据。CQL3实际上是基于底层存储行的抽象,所以它不是一对一的关系。如果您想要使用动态列名(有很多优秀的用例),请使用传统的Thrift接口(通过您选择的客户端库)。这将使您完全控制存储的内容。


Thrift已经非常过时了,推荐使用CQL,对吗?那么,当前的最佳做法是在每次插入之前运行大量的ALTER TABLE语句吗? - Mark
最简单的方法是通过map数据类型来实现,它实际上在底层创建动态列名。 - rs_atl
这是一篇关于在FQL中支持动态列的绝佳文章:http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows - Sebastian Nowak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接