2013-03-17 61 views
1

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

所以我有这样的解析代码:(使用撒克逊解析器这里)

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和各种雅虎教程。

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

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

在此先感谢。

注意:我知道这听起来像是mapreduce世界中一个非常微不足道的问题,我在这里展示的这个XML仅仅是一个标签里面没有标签的例子。

+0

也有类似的帖子堆栈溢出,但没有一个已被正确回答。我也知道有些东西在Hadoop中调用XMLInputFormat。但是我的问题是我不能将所有这些信息合并到一个正在运行的map reduce格式代码中。 – user1188611 2013-03-17 20:38:12

回答

0

这里是笏ü要 https://github.com/studhadoop/xmlparsing-hadoop/blob/master/XmlParser11.java

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

名称和值都在我的xml文件的标签。在你的情况下,如果你需要处理FACULTY中的标签,你可以使用名称而不是名称和年龄而不是值。

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

我想你的问题得到了一个大纲。 – 2013-04-02 09:40:35

+0

它如何处理hadoop在分离节点上分割文件的想法? – 2Big2BeSmall 2015-10-06 11:13:12

+0

它如何处理1 xml可能会分裂成2个不同的节点? – 2Big2BeSmall 2015-10-06 11:14:53

1

对于XML,您通常希望将其放入协议缓冲区,如AVRO和从那里进程。 hadoop生态系统在处理非结构化数据并将其转化为hdfs结构化数据方面发展壮大......因此,结构化数据的吸收和处理并不是生态系统的直观部分。 Mahout在其贝叶斯软件包中有一些与XML格式相关的代码,与Sree的答案非常相似。

+0

你可以在这里找到Mahout的'XmlImputFormat':https://github.com/apache/mahout/blob/ad84344e4055b1e6adff5779339a33fa29e1265d/examples/src/main/java/org/apache/mahout/classifier/bayes/XmlInputFormat.java – MasterScrat 2014-03-24 18:59:29