2015-02-06 156 views
0

我試圖創建一個使用JSONSerde具有以下結構的蜂巢表:蜂巢創建表錯誤

CREATE TABLE events (
device_uuid string, 
uuid string, 
custom struct< 
    "Vendor ID":int, 
    "Customer ID":int>, 
platform string 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
STORED AS TEXTFILE; 

當我嘗試創建表,我遇到的問題是:

Error occurred executing hive query: OK converting to local hdfs://dpcl01:820/user/hive/aux_jars/json-serde-1.3-jar-with-dependencies.jar Added /tmp/523576-5d62-4fff-b737-813aca807eee_resources/json-serde-1.3-jar-with-dependencies.jar to class path Added resource: /tmp/52356576-5d62-4fff-b737-813aca807eee_resources/json-serde-1.3-jar-with-dependencies.jar FAILED: ParseException line 8:2 cannot recognize input near '"Vendor ID"' ':' 'int' in column specification 

很明顯,這個錯誤是由於列名中的空格,但原始數據以這種形式出現,我不想執行預處理步驟來刪除空格。

有什麼建議嗎?

回答

0

如果您不想維持一個預處理階段(我假設在暫存表中加載原始文本,然後將其轉換爲您的上下文中的預處理),最直接的選項我將擴展SerDe以在反序列化過程中將空間替換爲下劃線,以便匹配Hive列/ struct字段名稱定義。根據我所看到的源代碼(我假設您使用的是this SerDe),可以覆蓋JSONObject對象類的put方法,以便參數key中的空白的所有實例在插入底層映射對象之前進行轉換。

如果你願意接受使用臨時表的辦法,你總是可以加載你的原始文本,並且使用get_json_object提取你所需要的,因爲空間是在蜂房JSON路徑完全正常。例如:

get_json_object(raw_text, "$.Vendor ID") 
+0

你是說使用get_json_object代替Serde?我不熟悉get_json_object,但是查詢不是:'select get_json_object(raw_text,「$ .custom.Vendor ID」)as vendor_id' – 2015-02-08 19:59:06

+0

@LouisRyan我認爲你已經掌握了它的要點。這樣,您的查詢就可以成爲JSON中的字段名稱和Hive列名稱之間的翻譯層。 – rchang 2015-02-08 20:39:07

+0

我知道這是一個很遠的問題,但我沒有Java的經驗,也不瞭解如何覆蓋方法。你能爲這個過程提供幫助嗎? – 2015-05-02 11:38:19