0

我一直在 hadoop 集群上执行分布式 XML 解析。我在我的 map-reduce 程序中使用这个 XmlInputFormat 。它工作得很好,我真诚地感谢那个贡献者。

但是,这是我遇到的问题:

在测试这几个 map-red 作业时,由于以下 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>"

我正在处理包含上述数据的日志。但正因为如此,整个工作都失败了。

我可以将预处理视为一种解决方案,但对我来说可能不是一个有效的选择。

您能否建议我一种方法来跳过此类不良记录/或仅替换 Java XML api 中的此类字符?

4

3 回答 3

0

如果您使用 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"'&'.

希望有帮助。

于 2013-07-01T20:19:37.437 回答
0

而不是&在您的 XML 中,尝试使用&amp;. 即而不是<name>Alen & Bob </name><name>Alen &amp; Bob </name>

于 2013-07-03T06:41:05.583 回答
0

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);
      }
  }
于 2013-07-01T15:38:51.497 回答