java - MapReduce程序中的XMLParser失败,并显示以下消息:实体名称必须立即在实体引用中的 '&'之后。

标签 java hadoop xml-parsing mapreduce

我一直在hadoop集群上执行分布式XML解析。我在 map 缩减程序中使用this XmlInputFormat。效果很好,由衷地感谢那个贡献者。

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

在测试这几个 map 红色作业时,以下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中的此类字符吗?

最佳答案

map函数(在您发布的the example中)中,无需捕获并重新抛出任何异常,只需捕获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);
      }
  }

关于java - MapReduce程序中的XMLParser失败,并显示以下消息:实体名称必须立即在实体引用中的 '&'之后。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17404628/

相关文章:

java - postgresql 中的 JdbcTemplate 批量更新 - 日期丢失时间?

java - 如何使用 JAVA 或任何脚本定期自动更改 mysql 密码?

java - 我正在尝试从链接下载图像并将其显示在 ImageView 中,但行 imgView.setImageBitmap(myImg);抛出一些错误

hadoop - 洗牌和排序后的 n-Records 到 reducer

hadoop - 查询不更新Oozie编辑器中的数据

hadoop - 基于 Oozie 文件的协调器

java - 导入 Xerces 库时无法构建应用程序(退出值 1)

java - Azure 表删除和创建表失败

c# - 在 C# 中使用 XML 的 jQuery 语法

java - 删除 SAX 解析器中的空格