0

以下是使用 API 从 LinkedIn 导出的 JSON 文件。

{
   "numResults": 21,
   "people":  
             {  "total": 21,
                 "values":
                         {    "firstName": "Kshitiz",
                              "headline": "Interbank Derivatives  Bank Treasury",
                               "id": "aK8sji3rN7",
                               "industry": "Financial Services",
                               "lastName": "Jain",
                               "locations": {"country": {"code": "in"},
                               "name": "Mumbai Area, India"
                                            },
                               "numConnections": 500,
                               "pictureUrl": "http://m3.licT5WVdExyDEYDzE6cp0VwZ"
                          }
             }

}

将上面的 json 文档保存在一个文本文件中,并导入到 hadoop 目录 /sample.xml 中。

使用以下命令创建外部表。还添加了 serde 的 JAR 文件。

create external table linkedi(numResults int,people Struct<total:int,values:Struct<firstName:String,headline:String,id:String,industry:String,lastName:String,locations:Struct<country:Struct<code:String>,name:String>,numConnections:int,pictureUrl:String>>)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde' location '/sample'; 

运行select statement ( select * from linkedi;)时显示以下错误。

OK 失败并出现异常 java.io.IOException:java.lang.ClassCastException: org.json.JSONObject 无法转换为 [Ljava.lang.Object; 耗时:0.213 秒

显示错误的原因是什么?表的结构是否有任何错误?

4

2 回答 2

1

我遇到了同样的麻烦。Panshul 是对的,Apache 的 SerDe 不支持嵌套 JSON。但是我仍然无法使用“hive-json-serde-0.2.jar”,至少不能使用最新版本的 Hive。

我发现最好的方法是使用 Openx 的 SerDe lib。简而言之,工作 JAR是 json-serde-1.3-jar-with-dependencies.jar 可以在这里找到。这个正在使用“STRUCT”,甚至可以忽略一些格式错误的 JSON。在创建表的过程中,包括以下代码:

 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
 WITH SERDEPROPERTIES ("ignore.malformed.json" = "true")
 LOCATION ...

如果需要,可以从这里这里重新编译它。在添加了必要的库之后,我尝试了第一个存储库,它对我来说编译得很好。该存储库最近也已更新。

在此处查看更多详细信息。

于 2015-09-26T19:00:38.867 回答
0

您使用的 SerDe 不支持嵌套 JSON。您可以先尝试扁平化 JSON 或尝试使用: hive-json-serde.googlecode.com/files/hive-json-serde-0.2.jar

于 2013-10-16T09:37:30.307 回答