Hadoop 连接两个表后配置单元时间戳值更改

Hadoop 连接两个表后配置单元时间戳值更改,hadoop,timestamp,hive,Hadoop,Timestamp,Hive,我有两个配置单元表,一个保存一个带有时间戳数据类型的日期值。如果我使用键查询一条特定记录,它会正确显示日期值。 从表1中选择科目索引、科目打开日期,其中科目索引=1234 acct_id account_open_date 1234 1963-03-01 00:00:00 但是,当将此表与另一个表联接时,返回的时间戳值在2031年更改为某个值 选择a.账户密钥,b.账户开户日期 从表2 a到表1 b的左外连接 在a.acct\U键上=b.acct\U键 acct_id

我有两个配置单元表,一个保存一个带有时间戳数据类型的日期值。如果我使用键查询一条特定记录,它会正确显示日期值。 从表1中选择科目索引、科目打开日期,其中科目索引=1234

 acct_id   account_open_date
 1234      1963-03-01 00:00:00
但是,当将此表与另一个表联接时,返回的时间戳值在2031年更改为某个值 选择a.账户密钥,b.账户开户日期 从表2 a到表1 b的左外连接 在a.acct\U键上=b.acct\U键

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

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

这里有两个问题,第一件事是join不使用时间戳和历元时间戳。在您的最后一行中,我假设联接返回的是其他时间戳的正确时间戳。如果我错了,请纠正我。因此,如果问题得到解决,您可以查看以处理纪元时间

我无法重现您看到的内容,但是,您可以尝试将
帐户打开日期
转换为
字符串

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.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)
工作版本:

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)

谢谢你的建议。我想知道,我是否可以直接按如下方式转换为字符串,而不是使用嵌套查询。这两者有区别吗?选择a.acct\u id,cast(b.account\u open\u date as string)new,db.table1 a中的其他列,在a.acct\u id=b.acct\u id上左外连接db.table 2 b;如上所述,我无法重现您看到的内容,但我假设在
连接过程中,
时间戳列被更改。所以我做了
cast
然后
join
。如果这是你担心的,我不认为会有太大的性能差异。