Cassandra:向表中添加新列

时间:2016-03-21 06:54:05

标签: cassandra cassandra-2.0 datastax datastax-java-driver

您好我刚刚将一个新列Business_sys添加到我的表my_table:

   ALTER TABLE my_table ALTER business_sys TYPE set<text>;

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

  ALTER TABLE my_table DROP business_sys;

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

"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>;

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

2 个答案:

答案 0 :(得分:4)

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

来自链接的JIRA票证:

  

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

     

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

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

  

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

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

答案 1 :(得分:0)

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

-警告- 根据{{​​3}}中的this comment,运行以下解决方法是不安全的。

详细说明@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>;