Hive XML Serde: ошибка синтаксического анализа при загрузке содержимого XML - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь загрузить следующее содержимое XML, используя SerDe с Hive:

<?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", как указано выше, он не работает.Мне пришлось вручную удалить содержимое «xmlns: i = ... / service» рядом с «RootTage», чтобы начать синтаксический анализ 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 голосов
/ 19 ноября 2018

Есть несколько вещей.

  • Я думаю, что корневой тег с пространством имен поддерживается только в версии 1.5.0.3 или выше. проверьте следующую ссылку https://github.com/dvasilen/Hive-XML-SerDe/issues/15
  • Я не думаю, что он поддерживает i:nil="true"
  • Отображение столбца должно соответствовать имени столбца, и оно чувствительно к регистру. column.xpath.Code и code не будут работать. Также нет соответствующего столбца для column.xpath.ParentElement

Так что вам нужно сделать?

  • Обновите свой класс.
  • заменить <EntityCode i:nil="true"/> на <EntityCode/> в вашем xml
  • Исправьте код, как указано ниже

Код

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>");
...