加入两个表后 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 时间戳值更改的主要内容,如果未能解决你的问题,请参考以下文章