1

嗨,我已经在 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 格式编写这段特定的代码。我曾在 yahoo 上将此特定教程称为hadoop和各种教程。

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

让我知道是否需要其他信息。我试图尽可能地短。

提前致谢。

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

4

2 回答 2

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 中的标签,您可以使用名称代替名称,使用年龄代替值。

conf.set("xmlinput.start", "<Faculty>");
 conf.set("xmlinput.end", "</Faculty>");
于 2013-04-02T09:38:06.273 回答
1

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

于 2013-12-01T17:30:21.567 回答