Hive为时间戳创建表语句,该时间戳不在yyyy-MM-dd HH:mm:ss'格式

时间:2015-03-13 16:09:33

标签: hive

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

{"timestamp": "2015-03-01T00:00:00+00:00", "metric": 23}
{"timestamp": "2015-03-01T00:00:01+00:00", "metric": 17}
...

时间戳的格式几乎与Hive友好的'yyyy-mm-dd hh:mm:ss'格式匹配,但有一些区别:日期和时间之间有'T'。还有一个时区偏移。例如,时间戳可能是2015-03-01T00:00:00+00:00而不是2015-03-01 00:00:00

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

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_DIFFDATE_ADD等...)的能力,而无需在查询中进行转换。可能的解决方法是CTASCAST the timestamp using a regular expression,但这需要将数据复制到新格式。这似乎效率低下,而且不符合“架构阅读”的精神。

有没有办法为这些数据创建架构而不处理数据两次(即一次加载,一次将时间戳转换为真正的时间戳)?

1 个答案:

答案 0 :(得分:2)

您需要决定是否:

  • 按照您的描述进行CTAS
  • 将转换工作/逻辑推送到表
  • 的使用者/客户端

对于第二个选项,这意味着在针对外部表执行的sql语句中包含字符串到时间戳转换。