gpt4 book ai didi

尝试使用 Apache POI 读取 MapReduce 中的 Word 文档时出现 Java.lang.ClassNotFoundException 错误

转载 作者:行者123 更新时间:2023-12-01 14:06:42 26 4
gpt4 key购买 nike

我正在尝试在我的mapreduce程序中读取word文档文件,为此我使用了用户定义的fileInputFormat类为WordDocxInputFormatWordDocxInputFormatRecordReader 。在 WordDocxInputFormatRecordReader类我正在使用 Apache POI 来读取单词 .docx文件。但我得到了 java.lang.ClassNotFoundException运行时错误。我在 Windows 7 平台上使用 Eclipse 和 Hadoop-0.20.2。
我已经定义了我的CLASSPATH如:JAVA_HOME\lib;C:\cygwin\home\bmohanty6\poijars\;C:\cygwin\home\bmohanty6\poijars\我保留了 POI 所需的以下 jar 文件(在附图中),并将它们添加到 Project->property->libraries->add external jar 中.

enter image description here

我收到错误为

13/09/17 12:35:26 INFO mapred.JobClient: Task Id : attempt_201309101108_0040_m_000000_2, Status : FAILED
Error: java.lang.ClassNotFoundException: org.apache.poi.xwpf.usermodel.XWPFDocument
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at WordDocxInputFormat$WordDocxInputFormatRecordReader.next(WordDocxInputFormat.java:112)
at WordDocxInputFormat$WordDocxInputFormatRecordReader.next(WordDocxInputFormat.java:1)
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.moveToNext(MapTask.java:192)
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.next(MapTask.java:176)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:48)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
at org.apache.hadoop.mapred.Child.main(Child.java:170)

这是我的 WordDocxInputFormat.class

import java.io.IOException;
import java.util.Arrays;
import java.io.FileInputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;


import org.apache.hadoop.mapred.FileSplit;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.InputSplit;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.RecordReader;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.xwpf.extractor.*;

/**
* Reads complete documents in Binary format.
*/
public class WordDocxInputFormat
extends FileInputFormat<Text, Text> {

public WordDocxInputFormat() {
super();
}

protected boolean isSplitable(FileSystem fs, Path filename) {
return false;
}

@Override
public RecordReader<Text, Text> getRecordReader(
InputSplit split, JobConf job, Reporter reporter) throws IOException {

return new WordDocxInputFormatRecordReader((FileSplit) split, job);
}

/**
* WordDocxInputFormatRecordReader class to read through a given binary document
* Outputs the filename along with the complete document
*/
public class WordDocxInputFormatRecordReader
implements RecordReader<Text, Text> {

private final FileSplit fileSplit;
private final Configuration conf;
private boolean processed = false;

public WordDocxInputFormatRecordReader(FileSplit fileSplit, Configuration conf)
throws IOException {
this.fileSplit = fileSplit;
this.conf = conf;
}

@Override
public Text createKey() {
return new Text();
}

@Override
public Text createValue() {
return new Text();
}

@Override
public long getPos() throws IOException {
return this.processed ? this.fileSplit.getLength() : 0;
}

@Override
public float getProgress() throws IOException {
return this.processed ? 1.0f : 0.0f;
}

@Override
public boolean next(Text key, Text value) throws IOException {
if (!this.processed) {

Path file = this.fileSplit.getPath();
try{
XWPFDocument docx = new XWPFDocument(new FileInputStream(file.toString()));
XWPFWordExtractor we = new XWPFWordExtractor(docx);
key.set(file.getName());
value.set(we.getText());
}
catch(IOException ex) {
Logger.getLogger(WordDocxInputFormatRecordReader.class.getName()).log(Level.SEVERE, null, ex);
}
this.processed = true;
return true;
}
else {
return false;
}
}

@Override
public void close() throws IOException {
}
}
}

最佳答案

"But I am getting a java.lang.ClassNotFoundException run time error"

如果您在编译时遇到此错误和运行时问题,但没有出现此错误,那么您几乎肯定在运行程序时使用了与编译时不同的设置。即,当您编译时,编译器会在包含 jar 的区域中查找,但是当您运行程序时,它会在其他地方查找而没有找到它们,因此为什么您的错误只会在运行时出现。如果这确实是您的问题,我有一些建议:

如果您使用 Eclipse,因为您的标签建议检查您的构建路径,我不知道 Eclipse 如何进行编译和运行,因此您可能需要检查一下。

或者,如果您定期使用这些 jar,您可以尝试将它们添加到 jvm 的外部库中,如本教程 here 所示。显示,然后确保使用该 jvm 进行编译和运行。将它们放置在教程中所示的区域中,可以让编译器在使用该 jvm 时在编译和运行时自动检查 jar。

希望这有帮助,祝你好运!

关于尝试使用 Apache POI 读取 MapReduce 中的 Word 文档时出现 Java.lang.ClassNotFoundException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18844127/

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