【问题标题】:Parsing XML files in Hadoop在 Hadoop 中解析 XML 文件
【发布时间】:2013-03-17 20:28:06
【问题描述】:

您好,我在 VMware 上以伪分布式模式安装了 hadoop-0.20.2-cdh3u5。我想使用这个已建立的环境解析 XML 文件。我可以通过编写 map/reduce 代码然后将它们作为 .jar 文件导出到集群上然后在集群上执行它们来做到这一点。我无法弄清楚的是如何将 java 解析代码(使用 SAXON 解析器)放入 map/reduce 类中,然后在输出中生成 csv 文件。

所以我有这个解析代码:(在这里使用 SAXon 解析器)

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JAXBC {
    private JAXBContext context;
private Unmarshaller um;
public JAXBC() throws JAXBException
{
    // creating JAXB context and instantiating Marshaller
    JAXBContext context = JAXBContext.newInstance(ConnectHome.class);

    // get variables from the xml file
    um = context.createUnmarshaller();

}

  public ConnectHome convertJAXB(String strFilePath) throws FileNotFoundException,     
   JAXBException 
   { 
      return ((ConnectHome) um.unmarshal(new FileReader(strFilePath)));
   }
 } 

我有类似这样的 XML:(此处的示例元素)

 <Course>
   <ID>1001</ID>
   <Seats>10</Seats>
   <Description>Department: CS , Faculty: XYZ</Description>
   <Faculty>
       <Name>XYZ</Name>
       <Age>30</Age>
   </Faculty>
 </Course>

现在我的问题是我无法弄清楚如何以 map/reduce 格式编写这段特定的代码。我已经参考了这个特定的教程a hadoop 和 yahoo 上的各种教程。

所以我的问题是有人可以告诉我如何编写这样的 map reduce 代码,然后从中创建一个 jar 文件。

如果需要其他信息,请告诉我。我尽量短。

提前致谢。

注意:我知道这在 mapreduce 世界中听起来像是一个非常微不足道的问题,而我在这里展示的这个 XML 只是其中包含少量标签的单个标签的一个示例。

【问题讨论】:

  • 在 stack-overflow 上也有类似的帖子,但没有一个得到正确回答。我也知道 Hadoop 中有一个叫做 XMLInputFormat 的东西。但我的问题是我无法将所有这些信息组合成一个运行的 map reduce 格式代码。

标签: java hadoop xml-parsing mapreduce


【解决方案1】:

这是你想要的 https://github.com/studhadoop/xmlparsing-hadoop/blob/master/XmlParser11.java

line 170 :if (currentElement.equalsIgnoreCase("name")) 
line 173 :else if (currentElement.equalsIgnoreCase("value")) 

name 和 value 是我的 xml 文件中的标签。在你的情况下,如果你需要处理 FACULTY 中的标签,你可以使用 Name 代替 name 和 Age 代替 value。

conf.set("xmlinput.start", "<Faculty>");
 conf.set("xmlinput.end", "</Faculty>");

【讨论】:

  • 我想你对你的问题有一个大致的想法。
  • 它如何处理hadoop在分离节点上拆分文件的想法?
  • 当 1 个 xml 可能被拆分为 2 个不同的节点时如何处理?
【解决方案2】:

对于 XML,您通常希望将其放入 AVRO 等协议缓冲区并从那里处理。 hadoop 生态系统是在处理非结构化数据并将其转换为 hdfs 结构化数据的过程中成长起来的……因此,结构化数据的接收和处理还不是生态系统的直观部分。 Mahout 在其 Bayes 包中有一些用于 XML 接收的代码,其工作方式与 Sree 的回答非常相似。

【讨论】:

猜你喜欢
  • 2014-11-06
  • 2017-05-08
  • 1970-01-01
  • 2012-03-14
  • 2011-05-18
  • 2017-12-22
  • 2016-11-17
  • 2011-03-06
  • 2013-07-17
相关资源
最近更新 更多