【问题标题】:Converting a list column to a set column in cassandra/DSE在 cassandra/DSE 中将列表列转换为集合列
【发布时间】:2018-07-25 10:48:35
【问题描述】:

在迭代新功能时,我的团队在我们的 DSE 数据库中创建了一个列表列。我们现在希望它是一个集合列。我删除了该列并再次将其创建为一个设置列并收到此错误:

ALTER TABLE sometable DROP somecolumn;
ALTER TABLE sometable ADD somecolumn set<text>;

InvalidRequest:来自服务器的错误:code=2200 [Invalid query] message="无法添加名称为integrations的集合,因为过去已经使用了具有相同名称和不同类型(列表)的集合"

列中甚至没有任何数据。没有某种硬删除覆盖吗?我们可以更改名称,但我真的不喜欢如果有人尝试使用它就不起作用的名称的想法。我必须重新制作整张桌子吗?

【问题讨论】:

  • 表中还有其他数据吗?
  • 不幸的是,是的。我需要迁移它,这是关键数据。
  • 用不同的名称创建一个列。您不能只使用相同的名称创建,因为旧的 sstables 是不可变的,数据可能仍然存在。

标签: cassandra nosql datastax cql datastax-enterprise


【解决方案1】:

最好的选择是添加一个具有不同名称的备用列或创建一个新表。

从技术上讲,可以删除和重新创建列,但如果您在磁盘和备份中的这些列中已有数据,则在节点崩溃时恢复联机可能会产生问题。 (您不能将一种格式的旧数据加载到不同格式的新列中)

如果你真的必须这样做,你可以这样做:

ALTER TABLE sometable DROP somecolumn;
ALTER TABLE sometable ADD somecolumn int;
ALTER TABLE sometable DROP somecolumn;
ALTER TABLE sometable ADD somecolumn set<text>;

(基于Cassandra: Adding new column to the table 中的评论)

【讨论】:

  • 请注意,这是一个危险的操作 (CASSANDRA-14843),在 Cassandra 3.11.5 及更高版本中被阻止,建议的解决方法是简单地添加一个具有新名称的新列。 community.datastax.com/questions/8018/…issues.apache.org/jira/browse/CASSANDRA-14948
  • 这是有风险的。除非您知道自己在做什么,否则您永远不应该这样做。您可能会导致集群进入无法启动具有旧数据的节点的状态。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2022-11-12
  • 2013-12-16
  • 2017-02-06
  • 2019-05-07
  • 2014-11-24
  • 1970-01-01
相关资源
最近更新 更多