Cassandra 改变从时间戳到日期的列类型

Cassandra Alter Column type from Timestamp to 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()

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

为了补充 Alex Ott 的回答,在 Cassandra 中进行了验证以防止更改列的数据类型。原因是 SSTables(Cassandra 数据文件)是 immutable —— 一旦写入磁盘,它们就永远不会 modified/edited/updated。它们只能压缩到新的 SSTables。

有些人试图通过从 table 中删除该列然后使用新的数据类型将其重新添加来绕过它。与传统的 RDBMS 不同,SSTable 中的现有数据不会得到更新,因此如果您尝试读取旧数据,您将得到 CorruptSSTableException,因为磁盘上数据的 CQL 类型与模式。

因此,无法再 drop/recreate 具有相同名称的列(CASSANDRA-14948). If you're interested, I've explained it in a bit more detail in this post -- https://community.datastax.com/questions/8018/。干杯!