加入两个表后 Hive 时间戳值更改

Posted

技术标签:

【中文标题】加入两个表后 Hive 时间戳值更改【英文标题】:Hive Timestamp value change after joining two tables 【发布时间】:2015-06-20 13:45:03 【问题描述】:

我有两个 Hive 表,一个包含时间戳数据类型的日期值。如果我使用键查询一条特定记录,它会正确显示日期值。 select acct_key, account_open_date from Table_1 where acct_key=1234;

 acct_id   account_open_date
 1234      1963-03-01 00:00:00

但是,当将此表与另一个表连接时,返回的时间戳值更改为 2031 年的某个值 选择 a.acct_key,b.account_open_date 从 Table_2 到 Table_1 b 的左外连接 a.acct_key=b.acct_key;

acct_id    account_open_date
 1234       2031-03-19 00:00:00

似乎这个问题只发生在 Unix 纪元时间(1970)之前的日期值。有什么建议吗?谢谢

【问题讨论】:

【参考方案1】:

这里有两个问题,首先加入不能使用时间戳和纪元时间戳。在您的最后一行中,我假设连接正在为其他时间戳返回正确的时间戳。如果我错了,请纠正我。所以如果解决了,你可以查看here 来处理纪元时间

【讨论】:

【参考方案2】:

我无法重现您所看到的内容,但您可以尝试将 account_open_date 转换为 string

select a.acct_id
    , b.new
    , other_columns
from db.table1
left outer join (
  select *
    , cast(account_open_date as string) new
  from db.table2 ) b
on a.acct_id=b.acct_id

【讨论】:

感谢您的建议。想知道而不是使用嵌套查询,我可以直接将其转换为字符串,如下所示。这两者有区别吗? select a.acct_id , cast(b.account_open_date as string) new , other_columns from db.table1 a, left outer join db.table 2 b on a.acct_id=b.acct_id; 如上所述,我无法重现您所看到的内容,但我假设在 join 期间以某种方式更改了时间戳列。所以我做了cast 然后join。如果这是您所担心的,我认为不会有太大的性能差异。【参考方案3】:

我试过了。在嵌套查询中将时间戳转换为字符串,如下所示。我也尝试过不使用嵌套查询,但这不起作用。有谁知道为什么?

无效版本:

SELECT 
   a.acct_id
  ,CAST(b.account_open_date AS STRING) new
  ,other_columns 
FROM 
  db.table1 a, 
  LEFT OUTER JOIN db.table2 b ON (a.acct_id = b.acct_id)
;

工作版本:

SELECT 
     a.acct_id
    ,b.new
    ,other_columns
FROM 
    db.table1 a
    LEFT OUTER JOIN (
        SELECT 
           *
          ,CAST(account_open_date AS STRING) new
       FROM 
          db.table2
    ) b
       ON (a.acct_id=b.acct_id)

【讨论】:

以上是关于加入两个表后 Hive 时间戳值更改的主要内容,如果未能解决你的问题,请参考以下文章

优化比较两个不同时间戳值的查询速度

在 Flutter 中显示两个 Firestore 时间戳值之间的差异

使用 pyspark 更改配置单元表后的架构错误

如何根据时间戳值计算子列表的平均值?

我们如何在 HIVE 的时间戳字段中添加毫秒

将时间戳值插入雪花表