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 中同一张表的时间戳不同的主要内容,如果未能解决你的问题,请参考以下文章

hive的安装,啥是hive的metastore的远程与本地

Hiveserver2高可用实现

Prestodb (AWS EMR) 加载分区元数据

Hive优化策略

如何使用presto查询hive数据

本地IDEAspark程序远程读取hive数据