我创建了一个表:
添加jar /../ xlibs / hive-json-serde-0.2.jar;
创建外部表SerdeTest (Unique_ID STRING ,MemberID STRING ,数据阵列> )
分段(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) ]
任何人都可以建议我做错了什么
答案 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 ...
如果需要,可以从here或here重新编译它。我尝试了第一个存储库,在添加必要的库后,它正在为我编译。存储库最近也已更新。
检查更多详情here。