如何在Cassandra数据库表中将int列转换为float / double列

时间:2016-01-22 07:12:32

标签: cassandra cassandra-2.0

我在生产中使用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

是否可以将整个一列字段复制到新添加的列中    同一个表中的字段?

1 个答案:

答案 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表