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

标签 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版本。

最佳答案

我终于找到了答案。用来序列化/反序列化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)

  • 他们都给了我各种各样的错误。我在这里列出了它们,以便下一个人可以对它们进行Google搜索:
  • 失败,发生异常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中找到。这个正在使用“STRUCT”,甚至可以忽略某些格式错误的JSON。我还必须使用此类创建表:
     ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
     WITH SERDEPROPERTIES ("ignore.malformed.json" = "true")
     LOCATION ...
    

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

    关于hadoop - 使用STRUCT进行的此简单Hive查询的语法错误在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785117/

    相关文章:

    hadoop - Pyspark:将数据帧保存到 hadoop 或 hdfs 而不会溢出内存?

    facebook - 我可以仅使用 Facebook 签名请求安全地验证 Facebook 用户吗?

    php - 推特应用程序接口(interface)

    sql - Hive 中的嵌套查询不起作用 : ParesException

    apache - Hive - 将 select 语句中的指定值插入到表和分区值中

    hadoop - 是否有 Hive on Hue (CDH 5.9.3) 的配置设置限制可以使用的容器数量?

    hadoop - 如何自动运行hadoop应用程序?

    api - 为什么 twitter 的自始至终参数不起作用?

    hadoop - 如何使用另一个表中的特定列值在 Hive 中创建表

    performance - hive 查询中 where 条件的顺序是否会影响查询性能?