Cassandra Alter从Timestamp到Date的列类型



是否有办法将Cassandra列从时间戳更改为日期而不丢失数据?例如'2021-02-25 20:30:00+0000'到'2021-02-25'

如果没有,将这个列(时间戳)迁移到新列(日期)的最简单方法是什么?

不可能更改现有列的类型,因此需要添加具有正确数据类型的新列,并执行迁移。迁移可以通过Spark + Spark Cassandra Connector来完成——这可能是最灵活的解决方案,甚至可以通过Spark在本地主模式(默认)下运行的单节点机器来完成。代码可能看起来像这样(首先尝试测试数据):

import pyspark.sql.functions as F
options = { "table": "tbl", "keyspace": "ks"}
spark.read.format("org.apache.spark.sql.cassandra").options(**options).load()
.select("pk_col1", "pk_col2", F.col("timestamp_col").cast("date").alias("new_name"))
.write.format("org.apache.spark.sql.cassandra").options(**options).save()

注:例如,您可以使用DSBulk,但是您需要有足够的空间来卸载数据(尽管您只需要主键列+时间戳)

添加到Alex Ott的答案中,Cassandra中有防止更改列的数据类型的验证。原因是sstable (Cassandra数据文件)是不可变的——一旦它们被写入磁盘,它们就永远不会被修改/编辑/更新。它们只能被压缩成新的sstable。

有些人试图通过从表中删除列,然后用新的数据类型将其添加回来来绕过它。与传统的RDBMS不同,sstable中的现有数据不会更新,所以如果你试图读取旧数据,你会得到一个CorruptSSTableException,因为磁盘上数据的CQL类型与模式不匹配。

因此,不再可能删除/重新创建具有相同名称的列(CASSANDRA-14948)。如果你感兴趣,我在这篇文章中更详细地解释了它- https://community.datastax.com/questions/8018/。干杯!

您可以使用ToDate来更改它。例如:表Email有列Date,格式为:2001-08-29 13:03:35.000000+0000.

Select Date, ToDate(Date) as Convert from keyspace.Email:
date | convert ---------------------------------+------------ 2001-08-29 13:03:35.000000+0000 | 2001-08-29

最新更新