Hive 2.3.2执行DDL任务返回码1报错,求解决方案
解决Hive 2.3.2中JsonSerDe加载失败的问题
你遇到的这个报错核心是SerDe类无法被Hive找到,大概率是JsonSerDe版本不兼容、jar包加载失败或者类路径配置出了问题。下面一步步帮你排查解决:
1. 确认JsonSerDe版本与Hive 2.3.2兼容
你当前用的json-serde-1.3.7.3.jar版本偏旧,和Hive 2.3.2的依赖可能不匹配。Hive 2.x系列推荐使用json-serde-1.3.9-jar-with-dependencies.jar(这个版本专门适配Hive 2.0+),建议替换成这个版本的jar包再尝试操作。
2. 确保jar包正确加载并可访问
- 先验证jar包路径有效性:在终端执行
ls /home/shashank/apache-hive-2.3.2-bin/lib/json-serde-1.3.7.3.jar,确认文件存在且你有读取权限。 - 在Hive CLI执行
add jar命令后,立即运行list jars;,查看目标jar是否出现在加载列表里——如果没出现,说明加载失败,可能是路径错误或权限不足。 - 更省心的方式是把jar包放到Hive的
auxlib目录(如果没有就手动创建$HIVE_HOME/auxlib),Hive启动时会自动加载这个目录下的jar,不用每次手动执行add jar。放好后重启Hive服务再试。
3. 验证SerDe类是否存在于jar包中
有时候jar包本身有问题,里面没有你指定的类。在本地终端执行以下命令检查:
jar tf /home/shashank/apache-hive-2.3.2-bin/lib/json-serde-1.3.7.3.jar | grep "org.openx.data.jsonserde.JsonSerDe"
如果没有输出,说明这个jar包里根本没有目标类,必须更换正确的jar包。
4. 尝试Hive自带的JSON支持(替代方案)
如果第三方SerDe折腾起来麻烦,Hive 2.3.2自带了JSON文件格式支持,你可以修改建表语句,去掉第三方SerDe的配置:
create external table if not exists tweets ( text string, entities STRUCT < hashtags:ARRAY<STRUCT<text:STRING>>>, `user` STRUCT< screen_name:STRING, friends_count:INT, followers_count:INT, statuses_count:INT, verified:BOOLEAN, utc_offset:INT, time_zone:STRING> ) row format delimited fields terminated by '\t' stored as jsonfile location '/user/hive/warehouse/twitter.db/tweets.json';
注意:这个要求你的数据文件是每行一个JSON对象的格式,和你原来的需求是兼容的。
5. 检查HDFS路径权限
虽然报错是SerDe相关,但也要确保Hive用户对/user/hive/warehouse/twitter.db/tweets.json路径有读写权限,执行:
hdfs dfs -ls /user/hive/warehouse/twitter.db/
如果权限不足,用hdfs dfs -chmod命令调整权限。
按照上面的步骤排查,应该能解决这个DDL执行失败的问题。
内容的提问来源于stack exchange,提问作者Shashank Tripathi
相关产品推荐
相关产品推荐

