如何读取地图中的所有行(mapreduce)

时间:2018-03-07 08:09:14

标签: hadoop mapreduce

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. 我希望有人可以帮助我。非常感谢你!

1 个答案:

答案 0 :(得分:0)

我认为MapReduce不是一个很好的选择。

但您可以在 Mapper 类中执行以下操作:

  1. setup()方法
  2. 中初始化一个空列表
  3. 将您收到的所有内容放入 map()方法
  4. 列表中
  5. 进行计算并在 clean()方法
  6. 中清除结果