【问题标题】:Hive Serde errors with Array<Struct<>> org.json.JSONArray cannot be cast to [Ljava.lang.Object;Array<Struct<>> org.json.JSONArray 的 Hive Serde 错误无法转换为 [Ljava.lang.Object;
【发布时间】:2014-10-20 09:54:44
【问题描述】:

我已经创建了一个表:

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

创建外部表 SerdeTest (唯一_ID STRING ,会员ID字符串 ,数据数组> )

分区者(Pyear INT,Pmonth INT)

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

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

文件中的数据:

{"Unique_ID":"ABC6800650654751","MemberID":"KHH966375835","Data":[{"SerialNo":1,"VariableName":"Var1","VariableValue":"A_49"},{ "SerialNo":2,"VariableName":"Var2","VariableValue":"B_89"},{""SerialNo":3,"VariableName":"Var3","VariableValue":"A_99"}]}

选择我正在使用的查询:

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

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

java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row [Error getting row data with exception java.lang.ClassCastException: org.json.JSONArray cannot be cast到 [Ljava.lang.Object; 在 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) 在 java.security.AccessController.doPrivileged(本机方法) 在 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) ]

谁能告诉我我做错了什么

【问题讨论】:

    标签: arrays json struct hive


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      查看更多详情here

      【讨论】:

      • 你是对的,但我的经验很少,实际上我认为相反:它是指向我自己在同一站点上的答案的链接,所以如果我更新它,我不需要也更新所有引用的答案:) 尽管如此,我会在这里添加更多细节。
      • 感谢更新,这样更有用。 :)
      猜你喜欢
      • 2014-02-03
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多