【发布时间】:2013-03-25 17:35:06
【问题描述】:
我正在重写 RecordReader 类的方法“next”和 TextInputFormat 类的“getRecordReader”,以便将整个段落发送到映射器,而不是逐行发送。 (我正在使用旧的 api,并且我的段落的定义是追加的,直到我的文本文件中出现一个空行。)
以下是我的代码:
public class NLinesInputFormat extends TextInputFormat
{
@Override
public RecordReader<LongWritable, Text> getRecordReader(InputSplit split, JobConf conf, Reporter reporter)throws IOException {
reporter.setStatus(split.toString());
return new ParagraphRecordReader(conf, (FileSplit)split);
}
}
public class ParagraphRecordReader implements RecordReader<LongWritable, Text>
{
private LineRecordReader lineRecord;
private LongWritable lineKey;
private Text lineValue;
public ParagraphRecordReader(JobConf conf, FileSplit split) throws IOException {
lineRecord = new LineRecordReader(conf, split);
lineKey = lineRecord.createKey();
lineValue = lineRecord.createValue();
}
@Override
public void close() throws IOException {
lineRecord.close();
}
@Override
public LongWritable createKey() {
return new LongWritable();
}
@Override
public Text createValue() {
return new Text("");
}
@Override
public float getProgress() throws IOException {
return lineRecord.getPos();
}
@Override
public synchronized boolean next(LongWritable key, Text value) throws IOException {
boolean appended, gotsomething;
boolean retval;
byte space[] = {' '};
value.clear();
gotsomething = false;
do {
appended = false;
retval = lineRecord.next(lineKey, lineValue);
if (retval) {
if (lineValue.toString().length() > 0) {
byte[] rawline = lineValue.getBytes();
int rawlinelen = lineValue.getLength();
value.append(rawline, 0, rawlinelen);
value.append(space, 0, 1);
appended = true;
}
gotsomething = true;
}
} while (appended);
//System.out.println("ParagraphRecordReader::next() returns "+gotsomething+" after setting value to: ["+value.toString()+"]");
return gotsomething;
}
@Override
public long getPos() throws IOException {
return lineRecord.getPos();
}
}
问题:
1. 我没有找到任何关于如何做到这一点的具体指南,所以可能是我做错了什么,请评论任何建议?
2. 我能够正确编译它,但是当我运行我的工作时,我的映射器一直在运行,我无法弄清楚问题出在哪里?
【问题讨论】:
-
你尝试过只输入一个段落吗?
-
我认为你有一个错误;当你交叉拆分时,你会得到额外的段落。我认为您需要区分从 0 开始的拆分和每隔一个拆分。以 0 开头的第一行开始一个段落,但以行开头的拆分不应开始一个新段落。 (通常你会读过一个分割边界,所以如果你的分割有连续一个段落的行,它们就会被前一个分割发出)。我错过了什么吗?
标签: hadoop