首页 > 解决方案 > 如何以 MapReduce 格式在一行中打印一些标记?

问题描述

我正在写一个地图功能。我有一个文本文件:

364.2   366.6   365.2   0   0   1   10421
364.2   366.6   365.2   0   0   1   10422

我想显示第 1,3 列。这是我的代码,但它显示了所有行。

public static class SumMap extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text str = new Text();

    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer lineIter = new StringTokenizer(value.toString(), "\\r?\\n");
        while (lineIter.hasMoreTokens()) {
            StringTokenizer tokenIter = new StringTokenizer(lineIter.nextToken(), "\\s+");
            while (tokenIter.hasMoreTokens()) {
                String v1 = tokenIter.nextToken();
                String v2 = tokenIter.nextToken();
                String c1 = tokenIter.nextToken();
                String c2 = tokenIter.nextToken();
                str.set(v1+c1);
                context.write(str, one);
            }

        }
    }
}

在此代码中,第一个应按行拆分("\\r?\\n"),然后对于每一行,按数字或字符串或标记拆分("\\s+")。最后,打印v1+c1。如何更改我的代码?

标签: javadictionaryhadoopsplitstringtokenizer

解决方案


如果使用TextInputFormat,map的key是行号,value是行内容。你不需要分割线。只需拆分每一行:

@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
    String[] vals = value.toString().split("\\s+");
    if (vals.length == 7) {
        context.write(new Text(vals[0] + vals[2]), one);
    }

}

推荐阅读