开发者社区 问答 正文

Canssandra插入时间戳保存utc时间,但复制自,时间偏移被反转?

我的群集时区是AST(UTC -0400)。

如果我在cqlsh中插入一行,则timestamp列保存在utc中:

insert into table(serial,month,timestamp,value) values ('35025962','201907','2019-07-25 00:00',2001) ; 如果我用select读取它,时间戳会像这样返回: 2019-07-25 04:00 +0000,因为我在UTC -0400,这是正确的。

如果我从仅包含此行的文件中复制:

35025962 201907 2019-07-25 00:00:00 0.000000 当使用cqlsh选择时,相同的时间戳显示为 2019-07-24 20:00 +0000

看起来像CQLSH INSERT asumes我是UTC -0400(正确),而COPY FROM asumes我是UTC +0400。为什么是这样?

我的创建表是:

CREATE TABLE table1 ( serial text, month text, timestamp timestamp, value float PRIMARY KEY ((serial, month), timestamp) 请帮助理解Cassandra时间戳列。

展开
收起
被纵养的懒猫 2019-09-17 17:13:41 786 分享 版权
阿里云 AI 助理回答

在Cassandra中,timestamp列默认存储为UTC时间。当你直接通过cqlsh执行INSERT语句时,你输入的本地时间(AST, UTC-0400)会被转换成UTC时间并存储。因此,当你查询时,Cassandra会将UTC时间转换回你的本地时间显示,这解释了为什么你会看到时间上的差异——因为查询结果被正确地调整回了AST。

然而,使用COPY FROM命令从文件导入数据时,Cassandra的行为基于一个假设:文件中的时间戳已经是UTC格式。如果你在文件中写入的是AST时间(没有明确指定时区),Cassandra会错误地将其当作UTC来处理,导致数据存储时发生偏移。所以在你的情况下,2019-07-25 00:00 AST被误解为2019-07-25 00:00 UTC,再转换到AST显示时就提前了一天,变成了2019-07-24 20:00。

要解决这个问题,你需要确保在使用COPY FROM命令导入包含时间戳的数据时,文件中的时间戳是按照UTC来表示的。如果数据是以非UTC时区记录的,你可能需要在导入前手动或通过脚本将这些时间转换为UTC格式。

总结来说,CQLSH INSERT操作智能地考虑了客户端(即cqlsh)的时区设置,并据此进行了适当的转换;而COPY FROM则简单地假定文件中的时间戳为UTC,除非你在COPY命令中指定了时区或者在数据准备阶段做了相应调整。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: