Map(offset,text)
每次只读一行。我的文件包含许多行,每行代表3D数据:x1,x2,x3
。
我想从块中选择n个,它们具有最高密度。
(然后通过map()
再次从所有reduce()
的结果中选择n个数据)
所以我应该计算Map()
中所有数据的平均距离(欧几里德距离),所以我想我应该读取所有的行,然后将它们放在一个数组中,然后使用for{for{}}
来计算平均值距离。
我检查了类LineRecordReader
的代码,并知道每次都读取多行:(使用for(int i=1;i<=5;i++){}
)
public boolean nextKeyValue() throws IOException {
if (key == null) {
key = new LongWritable();
}
key.set(pos);
if (value == null) {
value = new Text();
}
int newSize = 0;
// We always read one extra line, which lies outside the upper
// split limit i.e. (end - 1)
boolean flag=true;
int len =(int)fileSplit.getLength();
String aString = fileSplit.toString();
for(int i=1;i<=5;i++){
if(i==2){
flag=false;
}
while (getFilePosition() <= end || in.needAdditionalRecordAfterSplit()) {
if (pos == 0) {
newSize = skipUtfByteOrderMark();
} else {
newSize = in.readLine(value, maxLineLength, maxBytesToConsume(pos),flag);
pos += newSize;
}
if ((newSize == 0) || (newSize < maxLineLength)) {
break;
}
// line too long. try again
LOG.info("Skipped line of size " + newSize + " at pos " +
(pos - newSize));
}
}
if (newSize == 0) {
key = null;
value = null;
return false;
} else {
return true;
}
}
但我不知道如何读取所有行。 如何获取块的行数? T T. 我希望有人可以帮助我。非常感谢你!
答案 0 :(得分:0)
我认为MapReduce不是一个很好的选择。
但您可以在 Mapper 类中执行以下操作: