XMLParser в MapReduce Ошибка программы с сообщением: Имя объекта должно следовать сразу за символом «&» в ссылке на объект.

Я выполнял распределенный анализ XML в кластере Hadoop. Я использую этот XmlInputFormat в своих программах уменьшения карты. Это сработало довольно хорошо, и я искренне благодарю этого участника.

Но вот проблема, с которой я столкнулся:

При тестировании этих нескольких заданий с красной картой произошел сбой с указанным ниже XMLStreamException.

java.io.IOException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[21,69]
Message: The entity name must immediately follow the '&' in the entity reference.
at org.apache.hadoop.examples.XMLRecordCount$Map.map(XMLRecordCount.java:197)
at org.apache.hadoop.examples.XMLRecordCount$Map.map(XMLRecordCount.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:214)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[21,69]
Message: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:594)
at org.apache.hadoop.examples.XMLRecordCount$Map.map(XMLRecordCount.java:168)

Насколько я понимаю, это вызвано характером и данными. Например - "<name>Alen & Bob </name>"

Я имею дело с журналами, которые содержат такие данные. Но из-за этого вся работа проваливается.

Я могу думать о предварительной обработке как о решении, но это может быть неэффективным вариантом для меня.

Не могли бы вы предложить мне подход, с помощью которого я могу пропустить такие плохие записи или просто заменить такой символ в API Java XML?


person Dev.Next    schedule 01.07.2013    source источник


Ответы (3)


В функции mapпримере, который вы разместили), вместо этого перехвата и повторной генерации любого исключения, просто поймайте XMLStreamException и ничего не делайте в блоке catch. Ничего не будет испущено, и работа не завершится ошибкой. Однако вы, вероятно, захотите увеличить счетчик, чтобы отслеживать недействительные записи.

Псевдокод:

  protected void map(LongWritable key, Text value, Mapper.Context context) throws IOException
      try {
          XMLStreamReader reader = ...
          context.write(...);
      } catch(XMLStreamException e){
            // do nothing
            context.getCounter(INVALID_RECORDS).increment(1);
      }
  }
person jkovacs    schedule 01.07.2013

Вероятно, вы делаете это, если используете XmlParser11.java, как вы упомянули. Вы можете заменить «&» в объекте строки документа примерно так:

document = document.replace("&", "your_desired_working_string_here");
...
...
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new
                      ByteArrayInputStream(document.getBytes()));

а затем во время испускания из map() вы можете снова заменить

"your_desired_working_string_here" с '&'.

Надеюсь, это поможет.

person SSaikia_JtheRocker    schedule 01.07.2013

Вместо & в вашем XML попробуйте использовать &amp; . т.е. вместо <name>Alen & Bob </name> иметь <name>Alen &amp; Bob </name>

person Arijit Banerjee    schedule 03.07.2013