Hive XML Serde:加载xml内容时解析错误

时间:2018-11-19 14:03:37

标签: xml parsing hadoop hive hive-serde

我正在尝试使用带有Hive的SerDe加载以下XML内容:

<?xml version="1.0"?>
<RootTag xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.website.com/service">
<Code>123</Code>
<ParentElement>
   <Entity>
      <EntityId>A</EntityId>
      <EntityCode i:nil="true"/>
   </Entity>
   <Entity>
      <EntityId>M</EntityId>
      <EntityCode i:nil="true"/>
   </Entity>
</ParentElement>
</RootTag>

配置单元表创建如下:

CREATE EXTERNAL TABLE database.mytable(
code   String, 
Entity array<struct<Entity:struct<EntityId:String,EntityCode:String>>>
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES 
(
  "column.xpath.Code" = "/RootTag/Code/text()",
  "column.xpath.ParentElement" = "/RootTag/ParentElement"
)
STORED AS 
INPUTFORMAT  'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION     '/xml_content/'
TBLPROPERTIES ("xmlinput.start" = "<RootTag", "xmlinput.end" = "</RootTag>");

我有2个问题:

  1. 当我如上所述指定“ xmlinput.start”时,它不起作用。我必须手动删除“ RootTage”旁边的内容“ xmlns:i = ... / service”,才能开始解析xml。
  2. 尽管如此,“ EntityCode”属性仍然存在另一个问题。我收到错误消息:
Caused by: org.apache.hive.service.cli.HiveSQLException:
  java.io.IOException:
  org.apache.hadoop.hive.serde2.SerDeException: 
  java.lang.RuntimeException:
  org.xml.sax.SAXParseException;
  lineNumber: 41;
  columnNumber: 33;
  The prefix "i" for attribute "i:nil" associated with an element type "ParentCode" is not bound.

我在做什么错?感谢您提出的建议和意见。

1 个答案:

答案 0 :(得分:0)

几乎没有东西。

  • 我认为只有版本1.5.0.3 或更高版本才支持带有名称空间的根标记。检查以下链接https://github.com/dvasilen/Hive-XML-SerDe/issues/15
  • 我认为它不支持i:nil="true"
  • 列的映射应与列名匹配,并且区分大小写。 column.xpath.Codecode不起作用。也没有column.xpath.ParentElement
  • 的对应列

那么您需要做什么?

  • 升级您的Serde。
  • 将xml中的<EntityCode i:nil="true"/>替换为<EntityCode/>
  • 按如下所述修改代码

代码

CREATE EXTERNAL TABLE temp.test_xml(
code   String,
Entity array<struct<Entity:struct<EntityId:String,EntityCode:String>>>
)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES 
(
  "column.xpath.code" = "/RootTag/Code/text()",
  "column.xpath.Entity" = "/RootTag/ParentElement/Entity"

)
STORED AS 
INPUTFORMAT  'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION     '/tmp/test_xml1/table/'
TBLPROPERTIES (
                "xmlinput.start"="<RootTag",
                "xmlinput.end"="</RootTag>");