我的群集时区是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时间戳列。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在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命令中指定了时区或者在数据准备阶段做了相应调整。