【问题标题】:How to store date value in hive timestamp?如何将日期值存储在配置单元时间戳中?
【发布时间】:2016-04-13 09:59:45
【问题描述】:

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

有没有办法通过使用 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/'

【问题讨论】:

  • 将日期值 2015-01-01 转换为日期时间,如 2015-01-01 00:00:00.000
  • 你的意思是在输入文件中?

标签: hadoop hive hdfs hiveql


【解决方案1】:

我能够想到一个解决方法。用一小组数据进行了尝试:

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

`

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;



结果按预期显示:

【讨论】:

  • 谢谢,这是唯一的方法,但要让它工作,我们也需要修复历史数据,数据量很大。为了使其生产,我们需要重新加载所有数据。
  • 是的。这需要重新处理数据和历史修正
【解决方案2】:

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

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

【讨论】:

  • 基本上我们正在尝试通过将日期数据类型更改为时间戳来使 hive 表与 impala 兼容,由于 hive 时间戳不支持读取日期值而出现上述问题。所以最后的结论是修改HDFS中的文件来填充时间值。修复历史文件的大量工作,但没有其他选择。
  • 如果有帮助,请在下方添加回复。
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 2021-09-29
  • 2021-10-20
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多