我正在尝试解决以下recordreader问题。输入文件示例:
1,1
2,2
3,3
4,4
5,5
6,6
7,7
.......
.......
我要我的读卡器回来
key | Value
0 |1,1:2,2:3,3:4,4:5,5
4 |2,2:3,3:......6,6
6 |3,3:4,4......6,6,7,7
(对于第一个值第一个五行,对于第二个值从第二行开始五行,对于第三个值从第三行开始五行,依此类推) public class MyRecordReader extends RecordReader<LongWritable, Text> {
```
@Override
public boolean nextKeyValue() throws IOException, InterruptedException {
while (pos < end) {
key.set(pos);
// five line logic
Text nextLine=new Text();
int newSize = in.readLine(value, maxLineLength,
Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),
maxLineLength));
fileSeek+=newSize;
for(int n=0;n<4;n++)
{
fileSeek+=in.readLine(nextLine, maxLineLength,
Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),
maxLineLength));
value.append(":".getBytes(), 0,1);
value.append(nextLine.getBytes(), 0, nextLine.getLength());
}
if (newSize == 0) {
return false;
}
pos += newSize;
if (newSize < maxLineLength) {
return true;
}
// line too long. try again
LOG.info("Skipped line of size " + newSize + " at pos " + (pos - newSize));
}
return false;
}
}
但它返回的值是
key | Value
0 |1,1:2,2:3,3:4,4:5,5
4 |6,6:7,7.......10,10
6 |11,11:12,12:......14,14
有人能帮我用这个代码或一个新的代码重编机也可以吗?问题的要求(可能帮助您理解用例)谢谢
1条答案
按热度按时间kh212irz1#
我想我理解这个问题。。。我要做的是: Package 另一个recordreader并将其中的键/值缓冲到本地队列中。
例如,您可以有一个自定义inputformat来扩展textinputformat并覆盖
createRecordReader
要调用的方法super.createRecordReader
并返回一个MyRecordReader
,如下所示: