Phoenix 时区问题
最近在测试flink从trino查询数据插入到phoenix5的功能,发现一个时间的问题:
明明插入的时间是 '1940-06-01',查询出来的时间会少一天,同样的 Timestamp 也会自动少掉 8个小时,详细原因参考 Phoenix关于时区的处理方式说明。但是文章中阿里的已经处理,但是社区版的仍然有问题,好在社区版本的也有了对应的升级包PHOENIX-6623 ,把phoenix 5.14的版本编译好后,升级上去,打开 phoenix.query.applyTimeZoneDisplacement=true,但是经过测试大部分时间已经能够正常的显示,仍然有一些时间存在问题,
其中的原因是因为 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:
sqlline-thin:
另外:
5.14版本缺少 QueryServer的可以参考 关于Phoenix5.X 安装包不包含QueryServer服务问题_phoenix-hbase5.x(适配phoenix-queryserver)_Jason_yan0527的博客-CSDN博客,需要自行编译