hive-cli 和 presto-cli 中同一张表的时间戳不同
Posted
技术标签:
【中文标题】hive-cli 和 presto-cli 中同一张表的时间戳不同【英文标题】:Timestamp is different for the same table in hive-cli & presto-cli 【发布时间】:2021-09-17 16:33:36 【问题描述】:我在 hive-cli 和 presto-cli 中获得同一张表的不同时间戳。
表的表结构:
+----------------------------------------------------+
| createtab_stmt |
+----------------------------------------------------+
| CREATE EXTERNAL TABLE `mea_req_201`( |
| `mer_id` bigint, |
| `mer_from_dttm` timestamp, |
| `mer_to_dttm` timestamp, |
| `_c0` bigint, |
| `a_number` string, |
| `b_number` string, |
| `time_stamp` timestamp, |
| `duration` bigint) |
| PARTITIONED BY ( |
| `partition_col` bigint) |
| ROW FORMAT SERDE |
| 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' |
| STORED AS INPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' |
| OUTPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' |
| LOCATION |
| 'hdfs://hadoop5:8020/warehouse/tablespace/external/hive/mea_req_201' |
| TBLPROPERTIES ( |
| 'TRANSLATED_TO_EXTERNAL'='TRUE', |
| 'bucketing_version'='2', |
| 'external.table.purge'='TRUE', |
| 'spark.sql.create.version'='2.4.0.7.1.4.0-203', |
| 'spark.sql.sources.schema.numPartCols'='1', |
| 'spark.sql.sources.schema.numParts'='1', |
| 'transient_lastDdlTime'='1625496239') |
+----------------------------------------------------+
从 hive-cli 运行时,输出为:
虽然来自 presto-cli:
在 mer_from_dttm col 中存在时间差异,但对于其他时间戳列,日期完全相同。请注意,当从 presto-jdbc 完成时,此时间差行为也是相同的。我相信这与时区无关,因为如果是时区,则时差应该跨越所有时间戳列,而不仅仅是一个。请提供一些解决方案。
一些事实:
Presto 服务器版本:0.180
Presto Jdbc 版本:0.180
hive.time-zone=亚洲/加尔各答
在 Presto jvm.config 中:-Duser.timezone=Asia/Calcutta
客户时区:亚洲/加尔各答
编辑 1: 使用 mer_id 对查询进行排序,以确保两个查询都输出相同的一组行,但是错误行为仍然保持不变。
从 hive-cli 运行时:
从 presto-cli 运行时:
【问题讨论】:
【参考方案1】:Presto 0.180 真的很老了。它于 2017 年发布,并在此过程中修复了许多错误。
我建议您尝试使用最新版本。特别是,Trino (formerly known as PrestoSQL) 的最新版本在处理时间戳数据方面做了很多工作。
【讨论】:
感谢您的建议。将 Presto 升级到 0.256(latest)。但是,问题仍然存在。 imgur.com/dksGE0o 你试过 Trino 359(今天的最新版本)吗? 我不能使用 Trino 359。它需要 Java 11 并且我们在 Java 8 上运行我们的项目。但是,我尝试使用较低版本的 Trino,但得到了相同的错误结果集。 您有在 Presto 中运行的自定义代码吗?否则,您可以使用与主项目不同的 JVM 运行 Trino。您可以并排安装 JVM。 是的,我在项目类路径中有某些自定义的 presto UDf。但是,出于测试目的,我使用 Java 11 提出了 Trino 359。我在 trino-cli 中得到了正确的结果。 imgur.com/J0fsErV。感谢您的帮助。您是否知道任何可能已解决此问题的 PR?我们可以修补现有版本的 PrestoDB 的东西,因为使用 java 11 升级到 Trino 对我来说不是一个选择。【参考方案2】:使用 order by 查看每个客户端中的确切行。
SELECT `mer_id`,`mer_from_dttm`, `mer_to_dttm`, `time_stamp` FROM mea_req_201 ORDER BY `mer_id`;
【讨论】:
感谢您指出,不过,我使用的是精确行,已验证 Presto with orderby: pasteboard.co/Ka2DjZj.png HIve with order by: pasteboard.co/Ka2EjP6.png 编辑你的问题非常有用,用EDIT1-----行分隔并添加这两张图片。重要的是,在您的选择中添加mer_id
以查看返回的确切行。以上是关于hive-cli 和 presto-cli 中同一张表的时间戳不同的主要内容,如果未能解决你的问题,请参考以下文章