Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MapReduce程序中的XMLParser失败,消息为:实体名称必须紧跟在'&';在实体引用中。_Java_Hadoop_Xml Parsing_Mapreduce - Fatal编程技术网

Java MapReduce程序中的XMLParser失败,消息为:实体名称必须紧跟在'&';在实体引用中。

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

我一直在hadoop集群上执行分布式XML解析。我正在地图还原程序中使用。它运行得很好,我真诚地感谢那个贡献者

但是,我遇到了一个问题:

在测试这几个映射红色作业时,由于以下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)
据我所知,这是由于数据中的字符造成的。例如-
“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
have
Alen&;鲍勃