消除MapReduce中相同单词的对

时间:2016-04-04 15:08:48

标签: hadoop mapreduce

我想计算文本中每行的单词的共现数,就像单词与其他单词出现在同一行中的次数一样。为此,我创建了一个特殊的单词对,所以MapReduce会给我一对单词,然后是计数。问题是,我想只显示不同单词的共同出现。

这是代码:

public class Co_OcurrenciaMapper extends Mapper<LongWritable, Text, Par, IntWritable> {
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        IntWritable one = new IntWritable(1);
        String[] palabras = value.toString().split("\\W+");
        String palabra = new String();
        String vecino = new String();
        if (palabras.length > 1) {
            for (int i = 0; i < palabras.length - 1; i++) {
                for (int j = i + 1; j < palabras.length; j++) {
                    palabra = palabras[i];
                    vecino = palabras[j];
                    if (palabra.length() == 0 || vecino.length() == 0 || Character.isDigit(palabra.charAt(0)) || Character.isDigit(vecino.charAt(0))) {
                        continue;
                    }
                        if (palabra.compareTo(vecino) != 0) {
                            context.write(new Par(palabras[i], palabras[j]), one); /* here I am trying to go to the next pair if the words in the current pair are the same */
                        }                    
                    }

                }
            }
        }
    }
}

'Par'是包含一对单词的新类。

这是映射器输出:

[cloudera@quickstart ~]$ hadoop fs -cat salidaO34/part-r-00000 |tail -15
Par [young , youthful]  1
Par [younger , your]    5
Par [your , your]   88
Par [your , yours]  23
Par [your , yourself]   36
Par [your , yourselves] 8
Par [your , youth]  18
Par [your , youthful]   3
Par [your , zeal]   3
Par [your , zir]    1
Par [your , zounds] 1
Par [yours , yours] 2
Par [yours , yourself]  3
Par [yours , zeal]  1
Par [yourself , yourself]   1

你可以看到我有两对相同的单词。

1 个答案:

答案 0 :(得分:0)

首先尝试修剪字符串。

palabra = palabras[i].trim();
vecino = palabras[j].trim();

boolean emptyStrings = palabra.isEmpty() || vecino.isEmpty();
boolean haveDigit = Character.isDigit(palabra.charAt(0)) || Character.isDigit(vecino.charAt(0));
boolean sameWords = palabra.equals(vecino);

if (!(emptyStrings || haveDigit || sameWords)) {
    context.write(new Par(palabra, vecino), one);
}