使用STRUCT进行此简单Hive查询的语法错误在哪里?

时间:2015-09-25 15:00:57

标签: hadoop twitter hive hql

让我们在Hive中导入一个简单的表:

hive> CREATE EXTERNAL TABLE tweets (id BIGINT, id_str STRING, user STRUCT<id:BIGINT, screen_name:STRING>)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde'
LOCATION '/projets/tweets';

OK
Time taken: 2.253 seconds

hive> describe tweets.user;

OK
id                      bigint                  from deserializer
screen_name             string                  from deserializer
Time taken: 1.151 seconds, Fetched: 2 row(s)

我无法弄清楚语法错误在哪里:

hive> select user.id from tweets limit 5;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating user.id
Time taken: 0.699 seconds

我使用的是Hive版本1.2.1。

1 个答案:

答案 0 :(得分:0)

我终于找到了答案。似乎用于序列化/反序列化JSON的JAR存在问题。默认的(Apache)无法在我拥有的数据上做得很好。

我尝试了所有这些典型的JAR(在括号中,用于&#39; ROW FORMAT SERDE&#39;的类):

  • hive-json-serde-0.2.jar(org.apache.hadoop.hive.contrib.serde2.JsonSerde)
  • hive-serdes-1.0-SNAPSHOT.jar(com.cloudera.hive.serde.JSONSerDe)
  • hive-serde-1.2.1.jar(org.apache.hadoop.hive.serde2.DelimitedJSONSerDe)
  • hive-serde-1.2.1.jar(org.apache.hadoop.hive.serde2.avro.AvroSerDe)

所有这些都给了我不同的错误。我把它们列在那里,以便下一个人可以谷歌他们:

  • 异常java.io.IOException失败:org.apache.hadoop.hive.ql.metadata.HiveException:评估user.id时出错
  • java.lang.ClassCastException:org.json.JSONObject无法强制转换为[Ljava.lang.Object;
  • 异常失败java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.ClassCastException:java.lang.Integer无法强制转换为java.lang.Long 失败,异常
  • java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException:DelimitedJSONSerDe无法反序列化。
  • 异常java.io.IOException失败:org.apache.hadoop.hive.serde2.avro.AvroSerdeException:期待AvroGenericRecordWritable

最后,工作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重新编译它。我尝试了第一个存储库,在添加必要的库后,它正在为我编译。存储库最近也已更新。