我使用Cassandra作为数据库。我最初有一个表,列A的数据类型为文本,现在用例改变了,我希望表列出。所以我做了以下事情- Wrote migrationfile where -file 1.我删除列A的列类型为文本。
查询- ALTER TABLE DB_NAME.demo DROP A;
file 2.修改表,重新添加列A,列类型为list
查询- ALTER TABLE DB_NAME.demo ADD A列表;
我通过研究文章和建议使用了上述方法(也称为-Unable to change/alter the data type of column in cql cassandra)
在那之后,我有一个简单的脚本,它更新了A列中一些记录的值。
当我再次使用相同的列名/列和新的数据类型时,上述活动会对我的表造成任何问题吗?
那么,在cassandra扩展和重启之后,我会在cassandra DB中出现SSTable或异常的任何损坏吗?或者可能出现的任何其他问题?
问我的数据库被损坏,我不知道背后的原因!:(
我不知道或不明白为什么我在Cassandra上得到以下例外-
Caused by: java.io.IOException: Corrupt (negative) value length encountered
at org.apache.cassandra.utils.ByteBufferUtil.skipWithVIntLength(ByteBufferUtil.java:359) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.marshal.AbstractType.skipValue(AbstractType.java:456) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.rows.Cell$Serializer.deserialize(Cell.java:249) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.rows.UnfilteredSerializer.readComplexColumn(UnfilteredSerializer.java:670) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.rows.UnfilteredSerializer.lambda$deserializeRowBody$1(UnfilteredSerializer.java:611) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.utils.btree.BTree.applyForwards(BTree.java:1221) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.utils.btree.BTree.apply(BTree.java:1176) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.Columns.apply(Columns.java:384) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.rows.UnfilteredSerializer.deserializeRowBody(UnfilteredSerializer.java:605) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.UnfilteredDeserializer$CurrentDeserializer.readNext(UnfilteredDeserializer.java:209) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.columniterator.SSTableIterator$ForwardReader.computeNext(SSTableIterator.java:153) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.columniterator.SSTableIterator$ForwardReader.hasNextInternal(SSTableIterator.java:182) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.db.columniterator.AbstractSSTableIterator$Reader.hasNext(AbstractSSTableIterator.java:378) ~[apache-cassandra-3.11.3.jar:3.11.3]
... 32 common frames omitted
字符串
需要关于上述问题的帮助/指导!
或者他们是否有任何可能性,这个问题不是由于我的上述活动?
1条答案
按热度按时间3gtaxfhh1#
从Cassandra的表中删除列并不会删除数据。删除的列只是在一个特殊的表中标记为已删除,但该列的数据仍然存在;它们在向驱动程序发送响应之前被删除。因此,当您添加相同但不同类型的列时,当尝试读取数据时,Cassandra将使用错误的编解码器并无法解码数据,从而导致错误。
在压缩过程中会实际删除已删除列的数据,因此只有在确保所有旧数据都通过压缩删除后,才能添加同名列。