2016-12-29 47 views
1

我的數據以多個文件存儲在HDFS目錄/ tmp/kafka/alert中。每個文件都包含如下所示的換行分隔的JSON對象。使用JSON SerDe獲取所有NULL值的Hive外部表格

{"alertHistoryId":123456,"entityId":123,"deviceId":"123","alertTypeId":1,"AlertStartDate":"Dec 28, 2016 12:05:48 PM"} 
{"alertHistoryId":123456,"entityId":125,"deviceId":"125","alertTypeId":5,"AlertStartDate":"Dec 28, 2016 11:58:48 AM"} 

我加入蜂房JSON SERDE罐使用以下

ADD JAR /usr/local/downloads/hive-serdes-1.0-SNAPSHOT.jar; 

我創建的表有以下成功創建

CREATE EXTERNAL TABLE IF NOT EXISTS my_alert (
alertHistoryId bigint, entityId bigint, deviceId string, alertTypeId int, AlertStartDate string 
) 
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe' 
LOCATION '/tmp/kafka/alert'; 

表。但是當我獲取數據時,我得到了所有的空值。任何人都知道如何解決這個問題?

+0

看看這個解決方案:http://stackoverflow.com/questions/40854177/cloudera-hive-where-to-add-json-serde-1-3-7-jar-file –

+0

謝謝Rijul。但是,這和我的不是同一個問題。我沒有得到任何例外。外部表已成功創建。即使行數是正確的。但數據全爲空。我敢肯定,我錯過了一些微不足道的東西,但無法弄清楚什麼。 – Arjit

回答

0

您正在使用舊版本的JSON Serde。您的JSON Serde和Hadoop發行版可能存在問題。 請在下面鏈接以獲取Json Serde的新版本。按照鏈接中的步驟根據您的Hadoop發行版進行構建。

https://github.com/rcongiu/Hive-JSON-Serde

請參見下面的工作示例。

hive> add jar /User/User1/json-serde-1.3.8-SNAPSHOT-jar-with-dependencies.jar; 
Added [/User/User1/json-serde-1.3.8-SNAPSHOT-jar-with-dependencies.jar] to class path 
Added resources: [/User/User1/json-serde-1.3.8-SNAPSHOT-jar-with-dependencies.jar] 
hive> use default; 
OK 
Time taken: 0.021 seconds 
hive> CREATE EXTERNAL TABLE IF NOT EXISTS json_poc (
    > alertHistoryId bigint, entityId bigint, deviceId string, alertTypeId int, AlertStartDate string 
    >) 
    > ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
    > LOCATION '/User/User1/sandeep_poc/hive_json'; 
OK 
Time taken: 0.077 seconds 
hive> select * from json_poc; 
OK 
123456 123  123  1  Dec 28, 2016 12:05:48 PM 
123456 125  125  5  Dec 28, 2016 11:58:48 AM 
Time taken: 0.052 seconds, Fetched: 2 row(s) 
hive> 

如何構建jar。

Maven應該安裝在您的PC上,然後運行命令。

C:\Users\User1\Downloads\Hive-JSON-Serde-develop\Hive-JSON-Serde-develop>mvn -Phdp23 clean package

在我來說,我使用hdp2.3所以我提供-Phdp23

希望它會幫助,如果你願意用蜂巢JSON SERDE。

+0

謝謝Sandeep。它確實成功創建了表。雖然你的是一個完全不同的罐子,但這對我很有用。 – Arjit

0

不使用Serde添加罐和轉換那些總是overhead.Rather比你可以使用內置get_json_objectjson_tuple閱讀JSON。如果你正在尋找一個例子如何如果你想使用此博客querying-json-records-via-hive

只有使用JSON Serde才能看到Hive-JSON-Serde。在測試之前,首先驗證JSON Validator

+0

謝謝@Indrajit。您提到的博客表示,我們可以首先使用LOAD DATA LOCAL INPATH'/tmp/simple.json'INTO TABLE json_table;將數據加載到hive表中:'但我沒有單個json文件來加載數據。我有一些在HDFS上動態生成文件。你能指導我如何在我的上下文中使用這個解決方案嗎? – Arjit

+0

更新回答@Arijit –