【问题标题】:Where is the syntax error on this simple Hive query with STRUCT?这个使用 STRUCT 的简单 Hive 查询的语法错误在哪里?
【发布时间】:2015-12-23 11:01:45
【问题描述】:

让我们在 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 版本。

【问题讨论】:

    标签: hadoop twitter hive hql


    【解决方案1】:

    我终于找到了答案。用于序列化/反序列化 JSON 的 JAR 似乎存在问题。默认的(Apache)不能很好地处理我拥有的数据。

    我尝试了所有这些典型的 JAR(括号中是“ROW FORMAT SERDE”的类):

    • 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: Expecting a AvroGenericRecordWritable

    最后,工作 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 重新编译它。在添加了必要的库之后,我尝试了第一个存储库,它对我来说编译得很好。该存储库最近也已更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-29
      • 2021-03-15
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多