Hadoop实现词频统计(按照词频降序排列以及相同词频的单词按照字母序排列)
分为两步词频统计和排序。第一个map reduce与过滤停用词的代码相同;第二个map reduce中的map将键值对内容交换,map到reduce的shufle中会自动进行key值升序排序,这时需要重写排序为降序。Reduce中需要将相同词频的单词按照字母进行升序排列,.sort()方法默认时升序排列的。
重点:1.两个map reduce时需要将加入控制器
2.重写sort类,在shuffle中的排序
public static class Sort extends IntWritable.Comparator{
public int compare(WritableComparable a, WritableComparable b){
return -super.compare(a, b);
}
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
return -super.compare(b1, s1, l1, b2, s2, l2);
}
}
与knn代码写降序排序的.sort()方法对比:
Collections.sort(sortvalue, new Comparator() {
@Override
public int compare(String o1, String o2) {
// 升序
//return o1.getAge()-o2.getAge();
double x = Double.parseDouble(o1.split(",")[1]);
double y = Double.parseDouble(o2.split(",")[1]);
return Double.compare(x, y);
// 降序
// return Double.compare(y, x);
}
});
代码:
//利用分布式缓存方式设置全局变量
package wordcount;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; //报错类
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer; //StringTokenizer类,用于将空白字符作为分割符的类
import java.util.TreeSet;
import org.apache.hadoop.conf.Configuration;//Hadoop中用于读取配置信息的类
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path; //有关文件系统输入输出数据的类
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.IntWritable; //封装定义了IntWritable类
import org.apache.hadoop.io.LongWritable;