闲来无事,想看看小说中的什么字出现的频率比较高,就改了一下WordCount的程序。
原理:
主要的核心就是WordCount,那就先说下WordCount。
WordCount:
Map:
对每一行的输入,扫描到一个单词就将key设置为这个字符,将value设置为1。
Combiner:
将同一个key中的链表中的value进行求和求出暂时这个字符的次数,key不变,value为新的次数。
Reduce:
和Combiner的工作是一样的,Combiner就是为了减少中途的数据传输量。
上面就是最基础的WordCount了,我们要改进的是两个操作,一个是能读中文字符,第二个就是按照降序排列。
一:读中文字符:
原来的WorCount是根据空格Tab符进行分割,分割后是一个个的单词,而我们要将其改为中文字符就要用正则表达式的匹配了,在“UTF-8“编码下的中文字符的正则表达式为“[\\u4e00-\\u9fa5]”。(一定要小心的编码,如果编码不对结果就会出现错误,可以将文本主动保存为utf-8格式的就可以了。)然后将所有的找出来作为key就可以了。
Pattern p=Pattern.compile("[\\u4e00-\\u9fa5]");
Matcher matcher = p.matcher(line);
while (matcher.find()) {
word.set(matcher.group());
context.write(word, one);
//System.out.println(word);
}
二:降序排列:
这个我一开始以为可以很简单的,将结果并没有我想象的那么简单,相当于在程序里执行了两次作业,一次统计词频,一次专门排序。排序作业首先在map中将前面结果中的key,value中的值对调,所以现在key是词频,而value是汉字,然后重写IntWritable的 Comparator 类:
private static class IntWritableDecrea