如何用Hive SerDe解析XML数据?遇执行错误求解决
解决Hive XML SerDe创建外部表时的
org/apache/hadoop/hive/serde2/SerDe错误 你遇到的这个错误本质是Hive无法找到XML SerDe依赖的基础类,或者你使用的SerDe Jar包和当前Hive版本不兼容。下面是具体的排查和修复步骤:
1. 确认SerDe Jar包与Hive版本的兼容性
hivexmlserde-1.0.5.3.jar是比较旧的版本,大概率和你当前使用的Hive版本不匹配。先查一下你的Hive版本:
SELECT version();
- 如果是Hive 1.x,这个版本可能还能使用,但需要确认依赖完整性;
- 如果是Hive 2.x及以上,强烈建议更换适配版本的XML SerDe,比如改用Cloudera维护的
com.cloudera.hive.serde.XmlSerDe,或者Apache官方的XML SerDe(可从Maven仓库获取对应Hive版本的Jar包)。
2. 确保Jar包正确加载且可访问
你使用的add jar命令仅在当前Hive会话生效,若路径有误或权限不足,Jar包根本无法加载:
- 先验证HDFS上的Jar包是否存在:
hdfs dfs -ls hdfs://xtlinno1vftsnxg:8020/user/hdfs/hivexmlserde-1.0.5.3.jar
- 如果路径没问题,建议把Jar包放到Hive的
$HIVE_HOME/lib目录下,然后重启Hive服务,这样全局都能加载这个Jar,避免会话级加载的问题; - 也可以在Hive CLI里执行
list jars;,确认目标Jar包是否在已加载列表里。
3. 修正XML文件和表定义的细节
(1)给XML文件添加根节点
你的原始XML没有根节点,虽然指定了xmlinput.start和xmlinput.end,但部分XML解析器会对这种格式报错。建议给所有<book>节点套一个根节点:
<books> <book> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price discount="0.15">44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> <book> <author>Knorr, Stefan</author> <title>Creepy Crawlies</title> <genre>Horror</genre> <price discount="0.15">4.95</price> <publish_date>2000-12-06</publish_date> <description>An anthology of horror stories about roaches,centipedes, scorpionsand other insects.</description> </book> <book> <author>Galos, Mike</author> <title>Visual Studio 7: A Comprehensive Guide</title> <genre>Computer</genre> <price discount="0.15">49.95</price> <publish_date>2001-04-16</publish_date> <description>Microsoft Visual Studio 7 is explored in depth, looking at how Visual Basic, Visual C++, C#, and ASP+ are integrated into a comprehensive development environment.</description> </book> </books>
(2)调整表定义的关键配置
把LOCATION指向目录而非单个文件(Hive推荐这种方式),同时如果更换SerDe,要同步修改类名。比如改用Cloudera的SerDe的表定义:
CREATE EXTERNAL TABLE hive_test_xml( author string, title string, genre string ) ROW FORMAT SERDE 'com.cloudera.hive.serde.XmlSerDe' WITH SERDEPROPERTIES ( "column.xpath.author"="/book/author/text()", "column.xpath.title"="/book/title/text()", "column.xpath.genre"="/book/genre/text()" ) STORED AS INPUTFORMAT 'com.cloudera.hive.serde.XmlInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 'hdfs://xtlinno1vftsnxg:8020/user/poctest2/' TBLPROPERTIES ( "xmlinput.start"="<book", "xmlinput.end"="</book>" );
4. 检查依赖缺失问题
如果以上步骤都没解决,可能是这个SerDe依赖其他Jar包(比如XML解析库、Jackson等)。你可以查看Hive的日志($HIVE_HOME/logs或者YARN日志),里面的错误堆栈会告诉你具体缺哪个类,然后把对应的Jar包也添加到Hive的类路径里。
内容的提问来源于stack exchange,提问作者coder_enthusiast
相关产品推荐
相关产品推荐

