Cassandra:向表中添加新列

问题描述 投票:3回答:2

嗨,我刚刚在我的表my_table中添加了一个新列Business_sys:

   ALTER TABLE my_table ALTER business_sys TYPE set<text>;

但我再次删除了这个列名,因为我想更改列的类型:

  ALTER TABLE my_table DROP business_sys;

再次当我尝试使用不同的类型添加相同的列名称时收到错误消息

"Cannnot add a collection with the name business_sys because the collection with the same name and different type has already been used in past"

我只是尝试执行此命令以添加具有不同类型的新列 -

  ALTER TABLE my_table ADD business_sys list<text>;

我做错了什么?我对卡桑德拉很新。有什么建议?

cassandra cassandra-2.0 datastax datastax-java-driver
2个回答
4
投票

你遇到了CASSANDRA-6276。问题是当您在Cassandra中删除一列时,该列中的数据不会消失,而Cassandra可能会尝试使用其新的比较器类型读取该数据。

从链接的JIRA票证:

不幸的是,我们不能允许从比较器中删除组件,包括从ColumnToCollectionType中删除单个集合列。如果我们允许这样做,并且预先存在该类型的数据,C *根本就不知道如何比较这些......

...即使我们这样做,并允许[用户]创建一个具有相同名称的不同集合,我们也会遇到另一个问题:新集合的比较器将用于比较可能不兼容的类型。

JIRA认为这可能不是Cassandra 3.x中的一个问题,但我只是在3.0.3中尝试过它并且它失败并出现同样的错误。

我做错了什么?我对卡桑德拉很新。有什么建议?

不幸的是,解决这个问题的唯一方法是为新列表使用不同的名称。


0
投票

编辑:我在Cassandra尝试了这一点,结果是不一致的丢失数据。最好的方法是按照CASSANDRA-6276中的建议更改列名。并始终遵循文档指南:)

-WARNING-根据this commentCASSANDRA-6276,运行以下解决方法是不安全的。

详细阐述@ masum的注释 - 可以通过首先使用非收集类型(如int)重新创建列来解决限制。然后,您可以使用新的集合类型删除并重新创建。

从您的示例中,假设我们设置了business_sys:

ALTER TABLE my_table ADD business_sys set<text>;
ALTER TABLE my_table DROP business_sys;

现在将列重新添加为int并再次删除它:

ALTER TABLE my_table ADD business_sys int;
ALTER TABLE my_table DROP business_sys;

最后,您可以重新创建具有相同名称但不同集合类型的列:

ALTER TABLE my_table ADD business_sys list<text>;
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.