如何在hive时间戳中存储日期值?

byqmnocz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(495)

我正在尝试使用配置单元将日期和时间戳值存储在时间戳列中。源文件包含日期或时间戳的值。
有没有一种方法可以通过使用hive中的timestamp数据类型来读取日期和时间戳。
输入:

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

我得到的输出:

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

是否可以使用timestamp数据类型读取这两个值。
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/'
uqxowvwt

uqxowvwt1#

我想到了一个解决办法。用一小部分数据尝试了这一点:
通过将列设置为字符串数据类型,将日期数据不一致的数据加载到配置单元表(如table1)中。
现在创建另一个表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;

结果如预期所示:

h5qlskok

h5qlskok2#

hive在数据类型Map方面与任何其他数据库相似,因此需要为特定列提供统一的值,以便将其存储在一致的数据类型下。文件中第二列的数据具有非统一的数据,即一些数据是日期格式,而另一些数据是时间戳格式。
为了不丢失日期,正如@kishore建议的那样,请确保文件中有一个统一的数据类型,并获取时间戳值为的文件 2016-01-01 00:00:000 只有日期的地方。

相关问题