让我们在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”的类):
他们都给了我各种各样的错误。我在这里列出了它们,以便下一个人可以对它们进行Google搜索:
出现异常
最后,可以工作的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 ...
如果需要,可以从here或here重新编译它。我尝试了第一个存储库,在添加了必要的库之后,它对我来说编译正常。该存储库最近也已更新。
关于hadoop - 使用STRUCT进行的此简单Hive查询的语法错误在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785117/