我在HDFS中有一個包含時間戳和計數的JSON數據集。原始數據看起來是這樣的:Hive爲不是'yyyy-MM-dd HH:mm:ss'格式的時間戳創建表語句
{"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
。
我能夠創建一個表,提供我對待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_DIFF
,DATE_ADD
等),而不需要在查詢內進行強制轉換。可能的解決方法是CTAS和CAST the timestamp using a regular expression,但這需要將數據複製到其新格式。這似乎效率低下,並不符合「模式在讀」的精神。
有沒有辦法爲這個數據創建一個模式而不處理數據兩次(即一次加載,一次將時間戳轉換爲一個真正的時間戳)?