如何在配置单元时间戳中存储日期值?

How to store date value in hive timestamp?

我正在尝试使用配置单元将日期和时间戳值存储在时间戳列中。源文件包含日期值或有时包含时间戳。

有没有办法在 hive 中使用时间戳数据类型来读取日期和时间戳。

输入:

2015-01-01  
2015-10-10 12:00:00.232
2016-02-01

我得到的输出:

  null
  2015-10-10 12:00:00.232
  null

是否可以使用时间戳数据类型读取这两个值。

DDL:

create external table mytime(id string ,t timestamp) ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 'hdfs://xxx/data/dev/ind/'

Hive 在数据类型映射方面类似于任何其他数据库,因此需要特定列的统一值存储在一致的数据类型下。您的文件中第二列的数据具有不统一的数据,即一些是日期格式而另一些是时间戳格式。

为了不丢失日期,正如@Kishore 所建议的,确保文件中有统一的数据类型,并获取时间戳值为 2016-01-01 00:00:000 的文件,其中只有日期。

我想出了一个解决方法。用一小组数据试过这个:

  1. 将日期数据不一致的数据加载到配置单元中 table 说 table1 通过将列设为字符串数据类型。
  2. 现在创建另一个 table table2,并将数据类型作为所需列的时间戳,并使用转换 table1 将数据加载到 table2 INSERT OVERWRITE TABLE table2 select id,if(length(tsstr) > 10, tsstr, concat(tsstr,' 00:00:00')) from table1; 这应该以所需格式加载数据。
    代码如下:

`

create table table1
(
id int,
tsstr string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION '/user/cloudera/hive/table1.tb';

Data:
1,2015-04-15 00:00:00
2,2015-04-16 00:00:00
3,2015-04-17

LOAD DATA LOCAL INPATH '/home/cloudera/data/tsstr' INTO TABLE table1;


create table table2
(
id int,
mytimestamp timestamp
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION '/user/cloudera/hive/table2.tb';

INSERT INTO TABLE table2 select id,if(length(tsstr) > 10, tsstr, concat(tsstr,' 00:00:00')) from table1;



结果按预期显示: