Array <struct <>&gt;的Hive Serde错误org.json.JSONArray无法强制转换为[Ljava.lang.Object; </struct <>

时间:2014-08-26 23:09:41

标签: arrays json struct hive

我创建了一个表:

添加jar /../ xlibs / hive-json-serde-0.2.jar;

  

创建外部表SerdeTest   (Unique_ID STRING   ,MemberID STRING   ,数据阵列&gt;   )

     

分段(Pyear INT,Pmonth INT)

     

行格式SERDE“org.apache.hadoop.hive.contrib.serde2.JsonSerde”;

     

ALTER TABLE SerdeTest ADD   PARTITION(Pyear = 2014,Pmonth = 03)LOCATION'../ Test2';

文件中的数据:

  

{ “UNIQUE_ID”: “ABC6800650654751”, “MEMBERID”: “KHH966375835”, “数据”:[{ “的SerialNo”:1, “VARIABLENAME”: “VAR1”, “VariableValue”: “A_49”},{ “的SerialNo”:2 “VARIABLENAME”: “VAR2”, “VariableValue”: “B_89”},{ “” 的SerialNo “:3”,VARIABLENAME “:” VAR3" , “VariableValue”: “A_99”}]} < / p>

选择我正在使用的查询:

  

从SerdeTest中选择数据[0] .SerialNo,其中Unique_ID ='ABC6800650654751';

但是,当我运行此查询时,我收到以下错误:

  

java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:处理行时出现Hive运行时错误[错误获取行数据时异常java.lang.ClassCastException:org.json.JSONArray无法转换到[Ljava.lang.Object;           at org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector.getList(StandardListObjectInspector.java:98)           在org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:330)           在org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:386)           在org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:237)           在org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:223)           在org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:539)           在org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:157)           在org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)           在org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:418)           在org.apache.hadoop.mapred.MapTask.run(MapTask.java:349)           在org.apache.hadoop.mapred.Child $ 4.run(Child.java:270)           at java.security.AccessController.doPrivileged(Native Method)           在javax.security.auth.Subject.doAs(Subject.java:415)           在org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)           在org.apache.hadoop.mapred.Child.main(Child.java:264)    ]

任何人都可以建议我做错了什么

2 个答案:

答案 0 :(得分:0)

很少有建议: 确保hive和hive-json-serde-0.2.jar的所有包都具有hadoop用户的执行权限。 Hive在hive目录中创建一个名为derby.log和metastore_db的文件。应该允许用户调用hive查询来创建文件和目录。 数据的位置应该/最后。例如LOCATION'../ Test2 /';

答案 1 :(得分:-1)

简而言之,工作JAR 是json-serde-1.3-jar-with-dependencies.jar,可以找到here。这个正在与&#39; STRUCT&#39;甚至可以忽略一些格式错误的JSON。在创建表的过程中,请包含以下代码:

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

如果需要,可以从herehere重新编译它。我尝试了第一个存储库,在添加必要的库后,它正在为我编译。存储库最近也已更新。

检查更多详情here