Hive外部表XML多元素提取结果不符预期,求解决方案
解决Hive XML外部表提取数据行不匹配的问题
你现在遇到的情况是,XML里的每个<unit>本应对应Hive表的一行,但当前配置却把所有同名字段都聚合成了数组——这是因为你把整个<units>节点当作了单条Hive记录来处理。下面是具体的修正方案:
问题出在哪?
你的表属性里设置了xmlinput.start="<units version"和xmlinput.end="</units>",这会让Hive把整个<units>包裹的内容当作一条记录。SerDe会遍历所有/units/unit/id路径的元素,把它们打包成一个数组,name和subid字段也是同样的逻辑,所以才会得到数组形式的结果。
修正步骤
我们需要把每个<unit>节点作为单独的Hive记录,只需要调整两个关键部分:
- 修改记录边界:把
xmlinput.start和xmlinput.end改成<unit>和</unit>,让Hive识别每个unit为一条独立记录 - 调整字段XPath:因为现在记录的根是
<unit>,所以每个字段的路径要相对这个根来写,去掉/units/unit/前缀
修正后的建表语句
create external table testxml ( id string, name string, subid string ) row format serde "com.ibm.spss.hive.serde2.xml.XmlSerDe" with serdeproperties ( "column.xpath.id"="id/text()", "column.xpath.name"="name/text()", "column.xpath.subid"="details/detail/subid/text()" ) stored as inputformat "com.ibm.spss.hive.serde2.xml.XmlInputFormat" outputformat "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat" location "somepath/test" tblproperties ( "xmlinput.start"="<unit>", "xmlinput.end"="</unit>" );
验证结果
执行查询语句select * from testxml;后,就能得到你期望的输出:
+--+------+------+ |id| name| subid| +--+------+------+ | 1| ABC| 001| | 2| DEF| 002| +--+------+------+
额外提示
- 字段类型从
array<string>改成了string,因为现在每条记录只对应一个unit的单个值,不需要数组类型 - 如果你的XML里一个unit有多个detail(比如多个subid),那subid字段可以再改回
array<string>,XPath保持details/detail/subid/text()即可,这样会把当前unit下的所有subid聚合成数组
内容的提问来源于stack exchange,提问作者Deniz
相关产品推荐
相关产品推荐

