Tôi đang ghi đè phương thức "tiếp theo" của lớp RecordReader và "getRecordReader" của lớp TextInputFormat để gửi toàn bộ đoạn tới người lập bản đồ thay vì từng dòng một. (Tôi đang sử dụng api cũ và, định nghĩa cho đoạn tôi được nối thêm cho đến khi một dòng trống đi kèm trong tập tin văn bản của tôi.)
Dưới đây là mã của tôi:Ghi đè người đọc để đọc đoạn văn cùng một lúc thay vì dòng
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();
}
}
Câu hỏi:
1. Tôi không tìm thấy bất kỳ hướng dẫn cụ thể về cách làm điều này, vì vậy có thể có một cái gì đó tôi đang làm sai xin vui lòng bình luận bất cứ đề nghị?
2. Tôi có thể biên dịch chính xác nhưng khi tôi thực hiện công việc của mình, người lập bản đồ của tôi liên tục chạy và tôi không thể tìm ra vấn đề ở đâu?
Bạn đã thử chỉ với một đầu vào đoạn duy nhất? – Amar
Tôi nghĩ bạn có lỗi; bạn sẽ nhận được thêm đoạn văn khi bạn chia tách. Tôi nghĩ rằng bạn cần phải phân biệt giữa việc chia tách bắt đầu từ 0 và mỗi phần tách khác. Dòng đầu tiên bắt đầu với 0 bắt đầu một đoạn văn, nhưng các phần tách sau bắt đầu bằng một dòng không nên bắt đầu một đoạn văn mới. (Thông thường, bạn đã đọc qua một ranh giới phân chia, vì vậy nếu phân chia của bạn có các dòng tiếp tục một đoạn, chúng sẽ được phát ra bởi phần chia trước đó). Tui bỏ lỡ điều gì vậy? –