这个带有struct的简单配置单元查询的语法错误在哪里?

kqqjbcuj  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(407)

让我们在配置单元中导入一个简单的表:

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

fd3cxomn

fd3cxomn1#

我终于找到了答案。似乎是用于序列化/反序列化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.selsonserde)
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.io文件exception:org.apache.hadoop.hive.serde2.serdeexception:delimitedjsonserde无法反序列化。
失败,出现异常java.io.ioexception:org.apache.hadoop.hive.serde2.avro.avroserdeexception:应为avrogenerirecordwriteable
最后,工作jar是json-serde-1.3-jar-with-dependencies.jar,可以在这里找到。这个使用的是struct,甚至可以忽略一些格式错误的json。我还必须使用此类创建表:

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

如果需要,可以从这里或这里重新编译。我尝试了第一个存储库,在添加了必要的lib之后,它对我来说编译得很好。最近还更新了存储库。

相关问题