Hive 配置单元create table语句用于非';t在a';yyyy-MM-dd HH:MM:ss';格式

Hive 配置单元create table语句用于非';t在a';yyyy-MM-dd HH:MM:ss';格式,hive,Hive,我在HDFS中有一个JSON数据集,它包含一个时间戳和一个计数。原始数据如下所示: {"timestamp": "2015-03-01T00:00:00+00:00", "metric": 23} {"timestamp": "2015-03-01T00:00:01+00:00", "metric": 17} ... 时间戳的格式几乎与蜂巢友好的“yyyy-mm-dd hh:mm:ss”格式匹配,但有两个区别:日期和时间之间有一个“T”。还有一个时区偏移。例如,时间戳可能是2015-03-01

我在HDFS中有一个JSON数据集,它包含一个时间戳和一个计数。原始数据如下所示:

{"timestamp": "2015-03-01T00:00:00+00:00", "metric": 23}
{"timestamp": "2015-03-01T00:00:01+00:00", "metric": 17}
...
时间戳的格式几乎与蜂巢友好的“yyyy-mm-dd hh:mm:ss”格式匹配,但有两个区别:日期和时间之间有一个“T”。还有一个时区偏移。例如,时间戳可能是
2015-03-01T00:00:00+00:00
,而不是
2015-03-01 00:00:00

我能够创建一个表,前提是我将时间戳列视为字符串:

add jar hdfs:///apps/hive/jars/hive-json-serde-0.2.jar;

CREATE EXTERNAL TABLE `log`(
  `timestamp` string, 
  `metric` bigint)
ROW FORMAT SERDE "org.apache.hadoop.hive.contrib.serde2.JsonSerde" WITH SERDEPROPERTIES ("timestamp"="$.timestamp", "metric"="$.metric")
LOCATION 'hdfs://path/to/my/data';
这并不理想,因为如果将其视为字符串,我们就无法使用时间戳函数(例如,
DATE\u DIFF
DATE\u ADD
,等等),而无需从查询中强制转换。一个可能的解决方法是使用和,但这需要将数据复制到新格式。这似乎效率低下,不符合“阅读模式”的精神


是否有一种方法可以在不处理数据两次的情况下为该数据创建架构(即一次加载,一次将时间戳转换为真实时间戳)?

您需要决定是否:

  • 做你描述的CTA
  • 将转换工作/逻辑推送到表的使用者/客户机中
对于第二个选项,这意味着在针对外部表执行的sql语句中包含字符串到时间戳的转换