我在生产中使用cassandra数据库。我有一个列字段 一个cassandra表,例如coin_deducted是int数据类型。
我需要在float / double数据类型中转换coin_deducted。
但我尝试使用alter
来更改数据类型
表命令,但cassandra抛出不兼容的问题,而
将int转换为float。有没有办法做到这一点?
例如:目前显示如下:
user_id | start_time | coin_deducted (int)
122 | 26-01-01 | 12
I want to be
user_id | start_time | coin_deducted (float)
122 | 26-01-01 | 12.0
是否可以将整个一列字段复制到新添加的列中 同一个表中的字段?
答案 0 :(得分:2)
仅当旧类型和新类型兼容时,才可以更改列的类型。来自文档:
要更改列的存储类型,请更改为的类型 并且必须兼容。
当你写下声明时,还有一个证据就是无法做到这一点:
ALTER TABLE table_name ALTER int_column TYPE float;
它会告诉您类型不兼容。这也是合乎逻辑的,因为float是比int更宽的类型(有十进制),数据库不知道在十进制空间上放什么。以下是compatible类型的列表,可以毫无问题地相互更改。
解决方案1
您可以在应用程序级别执行此操作,在该表中再创建一列浮动并创建后台作业,该作业将遍历所有记录并将您的int
值复制到新的float
列。< / p>
我们为这样的情况创建了cassandra migration tool用于DATA和SCHEMA迁移,您将其添加为依赖项,并且可以编写SCHEMA迁移,这将添加新列并添加将在旧列的后台和复制值中触发的DATA迁移到新专栏。这是一个link到Java示例应用程序,用于查看用法。
解决方案2
如果您没有应用程序级别并希望仅在CQL中执行此操作,则可以使用COPY命令将数据提取到CSV,使用float创建新表,在CSV中手动对int值进行排序并将数据返回到new表