我一直在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>"
我正在处理包含上述数据的日志。但正因为如此,整个工作都失败了。
我可以认为预处理是一种解决方案,但对我来说可能不是一个有效的选择。
你能给我建议一种方法吗?通过这种方法,我可以跳过这样的坏记录/或者只是在javaxmlapi中替换这样的字符?
3条答案
按热度按时间0s0u357o1#
如果您使用的是前面提到的xmlparser11.java,您可能会这样做—您可以替换document string对象中的'&',例如:
然后在从map()发射时,您可以再次替换
"your_desired_working_string_here"
与'&'
.希望有帮助。
g52tjvyc2#
而不是
&
在xml中,尝试使用&
. i、 e.代替<name>Alen & Bob </name>
有<name>Alen & Bob </name>
uqdfh47h3#
在
map
函数(在您发布的示例中),而不是捕获和重试任何异常,只需捕获XMLStreamException
什么也不做。什么都不会被释放,工作也不会失败。不过,您可能需要增加一个计数器来跟踪无效记录。伪代码: