将大型XML解析为TSV

时间:2012-02-24 07:05:41

标签: hadoop xml-parsing saxparser bigdata

我需要解析几个XML到TSV,XML文件的大小大约为50 GB,我基本上怀疑我应该选择解析这个实现我有两个oprions

  1. 使用SAXParser
  2. 使用Hadoop
  3. 我对SAXParser实现有一点想法,但我认为可以访问Hadoop集群,我应该使用Hadoop,因为这就是hadoop用于大数据

    如果有人可以提供一个提示/文档,如何在Hadoop或高效的SAXParser实现这样一个大文件,或者我应该为Hadoop或SAXparser做什么,那将是很棒的。

4 个答案:

答案 0 :(得分:2)

我经常在Hadoop中处理大型XML文件。我发现它是最好的方式(不是唯一的方式......另一种方法是编写SAX代码),因为你仍然可以像dom一样的方式操作记录。

对于这些大文件,要记住的一件事是你绝对想要在mapper输出上启用压缩:Hadoop, how to compress mapper output but not the reducer output ...这会加快速度。

我已经快速概述了我是如何处理这一切的,也许它会有所帮助:http://davidvhill.com/article/processing-xml-with-hadoop-streaming。我使用Python和Etrees使事情变得非常简单......

答案 1 :(得分:0)

我不知道SAXparser。但是如果你有一个拥有足够数据节点的hadoop集群,那么Hadoop肯定会完成你的工作。 50Gb并不是因为我在集群上对超过300GB的数据执行操作。在java中编写map reduce作业,可以在http://hadoop.apache.org/

找到hadoop的文档

答案 2 :(得分:0)

通过在每个XML文件中使用一个映射器来处理hadoop上的XML是非常简单的。这种方法适用于大量相对较小的XML

问题在于,在你的情况下,文件很大,而且数量很小,所以不分裂hadoop的好处将是有限的。考虑到hadoop的开销,利益是负面的...... 在hadoop中,我们需要能够将输入文件拆分为逻辑部分(称为拆分),以便有效地处理大型文件。 通常,XML看起来不像“可拼接”格式,因为没有明确定义的块划分,可以独立处理。同时,如果XML包含某种类型的“记录”,则可以实现分割 关于在haoop中拆分XML的好讨论在这里: http://oobaloo.co.uk/articles/2010/1/20/processing-xml-in-hadoop.html 建议使用Mahout的XML输入格式。

关于你的情况 - 我认为只要你的文件数量不比单个系统上的核心数量大得多 - hadoop将不是有效的解决方案。
同时 - 如果你想随着时间的推移积累它们 - 你也可以从hadoop作为可扩展存储中获利。

答案 3 :(得分:0)

我认为SAX传统上错误与处理大型XML文件有关......实际上,VTD-XML通常是最佳选择,在性能,灵活性方面远优于SAX。代码的可读性和可维护性......在内存问题上,VTD-XML的内存模型只有相应XML文档大小的1.3x~1.5X。

VTD-XML与SAX相比具有另一个显着优势:其无与伦比的XPath支持。因此,VTD-XML用户通常会报告在数百MB XML文件上进行SAX解析时性能提升10到60倍。

http://www.infoq.com/articles/HIgh-Performance-Parsers-in-Java#anch104307

阅读本文,全面比较Java中现有的XML解析框架。

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf