在mapreduce中消除相同单词对

hsvhsicv  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(284)

我想计算文本中每行单词的共现次数,比如一个单词与其他单词出现在同一行的次数。为此,我创建了一个特殊的单词对类,因此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”是包含一对单词的新类。
这是Map器输出:

[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

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

gojuced7

gojuced71#

试着先剪线。

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);
}

相关问题