将hive中的数据从一个表插入到另一个表中,以便将mm / dd / yyyy转换为hive时间戳

时间:2016-05-27 07:10:21

标签: hadoop hive

我必须将数据填充到具有时间戳作为数据类型的Hive表中。 在这里参考其他答案我理解创建数据类型为字符串的新表的方法,然后转换为yyyy-mm-dd,因为我的格式为mm/dd/yyyy

CREATE TABLE tbl_t (
    t_id    varchar(50), 
    c_date  timestamp,
    name    varchar(25)
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t';

CREATE TABLE tbl_s (
    t_id    varchar(50), 
    c_date  string,
    name    varchar(25)
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t';

我用

填充了tbl_s
aa  11/08/1994  hhh
ss  11/09/2011  bbb
mm  09/07/2000  qqq

select t_id
  , from_unixtime(unix_timestamp(c_date ,'MM/dd/yyyy'),'yyyy-MM-dd')
  , name
from tbl_s;

这很好用。现在我需要填充我的orignal表。 使用查询:

insert into table tbl_t
select t_id
  , from_unixtime(unix_timestamp(c_date ,'MM/dd/yyyy'),'yyyy-MM-dd')
  , name
from tbl_s;

然后

select * from tbl_t;

返回

aa  NULL    hhh
ss  NULL    bbb
mm  NULL    qqq

为什么timestamp列为null?

2 个答案:

答案 0 :(得分:0)

你不需要from_unixtime函数中的额外参数'yyyy-MM-dd'。

insert into table tbl_t select t_id,from_unixtime(unix_timestamp(c_date ,'MM/dd/yyyy')),name from tbl_s;

请参阅this answerHive Date Functions

答案 1 :(得分:0)

Hive包含yyyy-mm-dd hh:mm:ss和可选的纳秒字段。在sql下面会将时间戳插入表

insert into table tbl_t select t_id, from_unixtime(unix_timestamp(c_date, 'dd/MM/yyyy')),name from tbl_s;

例如插入语句后的表内容

hive> select * from tbl_t; OK aa 2011-01-11 00:00:00 AAA bb 2012-02-22 00:00:00 BBB cc 2013-03-01 00:00:00 CCC

如果您只需要插入YYYY-MM-DD,则可以使用date类型而不是时间戳

实施例:

CREATE TABLE tbl_r( t_id varchar(50), c_date date, name varchar(25)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

insert into table tbl_r select t_id, to_date(from_unixtime(unix_timestamp(c_date, 'dd/MM/yyyy'),'yyyy-mm-dd')),name from tbl_s;

hive> select * from tbl_r; OK aa 2010-12-11 AAA bb 2011-12-22 BBB cc 2012-12-01 CCC