为何同版本Presto在CDH6上查询timestamp结果与Hive不一致,CDH5正常?
CDH6集群Presto查询ORC表时间戳偏移问题解答
根因分析
这个差异是CDH6和CDH5对应Hive版本对ORC文件timestamp类型的存储逻辑不兼容导致的,和Presto版本无关:
- CDH5搭载的是Hive 2.x及更早版本,存储ORC timestamp时直接写入对应时区的时间原始值,不会做UTC转换,该逻辑和Presto Hive Connector的默认读取逻辑完全适配,所以查询结果一致。
- CDH6搭载的是Hive 3.x分支版本,默认开启了ORC timestamp UTC序列化机制,写入时会将会话时区的时间转换为UTC值存储,读取时Hive会自动根据当前会话时区做反向转换得到原始值,所以Hive侧查询结果正常。但Presto默认沿用旧版ORC读取逻辑,会把存储的UTC值直接当做当前时区的时间返回,自然就出现了时区偏移,你这里出现的5小时30分偏移正好对应IST(印度标准时间,UTC+5:30)和UTC的差值,说明ORC文件写入时的会话时区为IST。
修复方案
修改Presto集群中Hive Connector的配置文件hive.properties,添加以下配置项:
# 关闭旧版ORC时间戳读取逻辑,适配Hive 3.x的存储规则 hive.orc.read-legacy-timestamp=false # 配置为ORC文件写入时使用的时区,和写入任务的时区保持一致即可 hive.orc.timestamp-time-zone=Asia/Kolkata
配置修改完成后重启Presto集群,再次查询即可得到和Hive一致的时间戳结果。
内容的提问来源于stack exchange,提问作者RaviKumar
相关产品推荐
相关产品推荐

