2015-03-13 44 views
1

我在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等),而不需要在查詢內進行強制轉換。可能的解決方法是CTASCAST the timestamp using a regular expression,但這需要將數據複製到其新格式。這似乎效率低下,並不符合「模式在讀」的精神。

有沒有辦法爲這個數據創建一個模式而不處理數據兩次(即一次加載,一次將時間戳轉換爲一個真正的時間戳)?

回答

2

你需要決定是否:

  • 做CTAS像你描述
  • 推進轉換工作/邏輯到消費者/表

的客戶的第二個選項這意味着將字符串轉換爲包含時間戳的sql語句在外部表中執行。

相關問題