gpt4 book ai didi

hadoop - 在大型XML输入文件的情况下如何处理Hadoop拆分

转载 作者:行者123 更新时间:2023-12-02 21:35:28 25 4
gpt4 key购买 nike

我有一个非常大的输入文件,它是XML数据。

因此,现在当我将其放入HDFS时,逻辑上将创建HDFS块,并且XML记录也将在各块之间分配。现在,典型的TextInputFormat通过跳过第一行(如果它不是行的开始)来处理该场景,并且从逻辑上讲,以前的映射器从该块读取(通过RPC)直到记录结束。

在XML情况下,我们如何处理这种情况?我不想使用WholeFileInputFormat,因为那样对使用并行性没有帮助。

<books>
<book>
<author>Test</author>
<title>Hadoop Recipes</title>
<ISBN>04567GHFR</ISBN>
</book>
<book>
<author>Test</author>
<title>Hadoop Data</title>
<ISBN>04567ABCD</ISBN>
</book>
<book>
<author>Test1</author>
<title>C++</title>
<ISBN>FTYU9876</ISBN>
</book>
<book>
<author>Test1</author>
<title>Baby Tips</title>
<ISBN>ANBMKO09</ISBN>
</book>
</books>

XMLRecordReader的初始化函数如下所示:
public void initialize(InputSplit arg0, TaskAttemptContext arg1)
throws IOException, InterruptedException {

Configuration conf = arg1.getConfiguration();

FileSplit split = (FileSplit) arg0;
start = split.getStart();

end = start + split.getLength();
final Path file = split.getPath();
FileSystem fs = file.getFileSystem(conf);
fsin = fs.open(file);
fsin.seek(start);

DocumentBuilder db = null;
try {
db = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Document doc = null;
try {
doc = db.parse(fsin);
} catch (SAXException e) {
e.printStackTrace();
}
NodeList nodes = doc.getElementsByTagName("book");

for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
BookWritable book = new BookWritable();
NodeList author = element.getElementsByTagName("author");
Element line = (Element) author.item(0);
book.setBookAuthor(new Text(getCharacterDataFromElement(line)));

NodeList title = element.getElementsByTagName("title");
line = (Element) title.item(0);
book.setBookTitle(new Text(getCharacterDataFromElement(line)));

NodeList isbn = element.getElementsByTagName("ISBN");
line = (Element) isbn.item(0);
book.setBookISBN(new Text(getCharacterDataFromElement(line)));

mapBooks.put(Long.valueOf(i), book);
}
this.startPos = 0;
endPos = mapBooks.size();
}

使用DOM解析器来处理XML解析部分,不确定(但可能是如果我进行模式匹配),则DOM解析器解析问题将得到解决(如果其中一个拆分中的XML损坏),但也会解决最后映射器完成下一个输入拆分的记录?

如果有一些基本问题,请纠正我,如果有任何解决方案,那将有很大的帮助。

谢谢,
AJ

最佳答案

您可以尝试mahout的XMLinputFormat类。 《 Hadoop in action》一书中的更多解释

关于hadoop - 在大型XML输入文件的情况下如何处理Hadoop拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32590957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com