有没有办法将Cassandra列从时间戳更改为日期而不丢失数据?例如,将“2021-02-25 20:30:00+0000”更改为“2021-02-25”如果没有,将此列(时间戳)迁移到新列(日期)的最简单方法是什么?
dba5bblo1#
不可能更改现有列的类型,因此您需要添加一个具有正确数据类型的新列,并执行迁移。迁移可以通过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,但是您需要有足够的空间来卸载数据(尽管您只需要主键列+时间戳)
62lalag42#
为了补充Alex Ott的答案,Cassandra中做了一些验证,以防止更改列的数据类型。原因是SSTables(Cassandra数据文件)是不可变的--一旦它们被写入磁盘,就永远不会被修改/编辑/更新。它们只能被压缩为新的SSTables。有些人试图通过从表中删除列,然后用新的数据类型将其添加回表中来解决这个问题。与传统的RDBMS不同,SSTables中的现有数据不会更新,因此如果您试图读取旧数据,您将得到CorruptSSTableException,因为磁盘上数据的CQL类型与模式的CQL类型不匹配。由于这个原因,不再可能删除/重新创建具有相同名称(CASSANDRA-14948)的列。如果您感兴趣,我已经在这篇文章中更详细地解释了它-https://community.datastax.com/questions/8018/。干杯!
CorruptSSTableException
gwo2fgha3#
您可以使用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
3条答案
按热度按时间dba5bblo1#
不可能更改现有列的类型,因此您需要添加一个具有正确数据类型的新列,并执行迁移。迁移可以通过Spark + Spark Cassandra Connector完成-这可能是最灵活的解决方案,甚至可以通过单节点机器完成,Spark运行在本地主模式(默认)。代码可能如下所示(首先尝试测试数据):
例如,您可以使用DSBulk,但是您需要有足够的空间来卸载数据(尽管您只需要主键列+时间戳)
62lalag42#
为了补充Alex Ott的答案,Cassandra中做了一些验证,以防止更改列的数据类型。原因是SSTables(Cassandra数据文件)是不可变的--一旦它们被写入磁盘,就永远不会被修改/编辑/更新。它们只能被压缩为新的SSTables。
有些人试图通过从表中删除列,然后用新的数据类型将其添加回表中来解决这个问题。与传统的RDBMS不同,SSTables中的现有数据不会更新,因此如果您试图读取旧数据,您将得到
CorruptSSTableException
,因为磁盘上数据的CQL类型与模式的CQL类型不匹配。由于这个原因,不再可能删除/重新创建具有相同名称(CASSANDRA-14948)的列。如果您感兴趣,我已经在这篇文章中更详细地解释了它-https://community.datastax.com/questions/8018/。干杯!
gwo2fgha3#
您可以使用ToDate来变更它。例如:表Email包含格式为Date的列:2001-08-29 13:03:35.000000+0000.在一个例子中,一个人在一个房间里,一个人在另一个房间里。