罪恶克星 发表于 2023-7-29 01:50:26

Phoenix 时区问题

      最近在测试flink从trino查询数据插入到phoenix5的功能,发现一个时间的问题:
https://img2023.cnblogs.com/blog/1938370/202307/1938370-20230728101921529-492632003.png
 明明插入的时间是 '1940-06-01',查询出来的时间会少一天,同样的 Timestamp 也会自动少掉 8个小时,详细原因参考  Phoenix关于时区的处理方式说明。但是文章中阿里的已经处理,但是社区版的仍然有问题,好在社区版本的也有了对应的升级包PHOENIX-6623   ,把phoenix 5.14的版本编译好后,升级上去,打开  phoenix.query.applyTimeZoneDisplacement=true,但是经过测试大部分时间已经能够正常的显示,仍然有一些时间存在问题,
https://img2023.cnblogs.com/blog/1938370/202307/1938370-20230728110652163-481278441.png
        其中的原因是因为 phoenix 采用的 org.joda.time 工具包,存的时间是按照GMT时区存的数据,对于夏令时的处理存在问题,详细可以参照   消失了的那些天——Joda中的夏令时。对于特殊的几个时间 1940-06-01、1941-03-16、1986-05-04、1987-04-12、1988-04-10、1989-04-16、1990-04-15、1991-04-14 的时间夏令时的偏移量是按照9小时来处理的,正常的时间按照8个小时来做处理,通过时区的转换 ,这种正好是夏令时多1个小时的就会显示少1一天。目前社区应该没有解决特殊的夏令时的显示。
 
目前的解决方案:升级到phoenix 5.14版本,打开phoenix.query.applyTimeZoneDisplacement=true,Timestamp格式是可以正常显示,date 类型数据仍然存在一点问题,查询的客户端使用 sqlline-thin 客户端以及QueryServer JDBC,sqlline 的客户端to_char显示的是GMT时区的时间,sqlline-thin to_char显示的是 GMT+8 的时间,date 类型的数据通过 SUBSTR(to_char(date),1,10) 来解决显示问题,如果不存在这几个夏令时时间,就可以直接查询原表
sqlline:
https://img2023.cnblogs.com/blog/1938370/202307/1938370-20230728110137921-1725304399.png
 sqlline-thin:
https://img2023.cnblogs.com/blog/1938370/202307/1938370-20230728105803741-890322005.png
 另外:
5.14版本缺少 QueryServer的可以参考 关于Phoenix5.X 安装包不包含QueryServer服务问题_phoenix-hbase5.x(适配phoenix-queryserver)_Jason_yan0527的博客-CSDN博客,需要自行编译
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Phoenix 时区问题