Java MapReduce程序中的XMLParser失败,消息为:实体名称必须紧跟在'&';在实体引用中。
我一直在hadoop集群上执行分布式XML解析。我正在地图还原程序中使用。它运行得很好,我真诚地感谢那个贡献者 但是,我遇到了一个问题: 在测试这几个映射红色作业时,由于以下XMLStreamException而失败Java MapReduce程序中的XMLParser失败,消息为:实体名称必须紧跟在'&';在实体引用中。,java,hadoop,xml-parsing,mapreduce,Java,Hadoop,Xml Parsing,Mapreduce,我一直在hadoop集群上执行分布式XML解析。我正在地图还原程序中使用。它运行得很好,我真诚地感谢那个贡献者 但是,我遇到了一个问题: 在测试这几个映射红色作业时,由于以下XMLStreamException而失败 java.io.IOException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[21,69] Message: The entity name must immediately follow th
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)
据我所知,这是由于数据中的字符造成的。例如-“Alen&Bob”
我正在处理包含上述数据的日志。但正因为如此,整个工作都失败了
我可以认为预处理是一种解决方案,但对我来说可能不是一个有效的选择
你能给我建议一种方法吗?通过这种方法,我可以跳过Java XML api中的这些坏记录/或者仅仅替换这些字符吗?在
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);
}
}
如果您正在使用前面提到的XmlParser11.java,则可能会这样做-您可以替换文档字符串对象中的“&”,如下所示:
document = document.replace("&", "your_desired_working_string_here");
...
...
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new
ByteArrayInputStream(document.getBytes()));
然后在从map()发射时,您可以再次替换
“您想要的\u工作字符串\u在这里”
与“&
希望这会有所帮助。请尝试使用
&代码>。i、 e.代替Alen&Bob
haveAlen&;鲍勃