如何在配置单元时间戳中存储日期值?
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
的文件,其中只有日期。
我想出了一个解决方法。用一小组数据试过这个:
- 将日期数据不一致的数据加载到配置单元中 table 说 table1 通过将列设为字符串数据类型。
- 现在创建另一个 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;
结果按预期显示:
我正在尝试使用配置单元将日期和时间戳值存储在时间戳列中。源文件包含日期值或有时包含时间戳。
有没有办法在 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
的文件,其中只有日期。
我想出了一个解决方法。用一小组数据试过这个:
- 将日期数据不一致的数据加载到配置单元中 table 说 table1 通过将列设为字符串数据类型。
- 现在创建另一个 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;
结果按预期显示: