【问题标题】:Timestamp is different for the same table in hive-cli & presto-clihive-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 运行时:

【问题讨论】:

    标签: hadoop hive presto


    【解决方案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 以查看返回的确切行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2014-08-19
    • 2015-04-02
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多