2016-12-29 105 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 –