今日总结
统计一段文本里出现频率最高的前k个词,注意单词不分大小写。
过程分析
首先从文件读入数据到RDD,然后使用flatMap算子对每一行的数据按照空格进行分割,并将所有的字母都转为小写,接着使用mapToPair算子对每一个单词添加计数标记1,然后使用reduceByKey算子对单词进行reduce聚合,为了根据key来排序,聚合后再使用mapToPair算子将得到的pair里面的key和value调换一下位置。然后使用sortByKey算子根据key来进行排序,最后使用take算子取出排名前5的数据。
public class wordTopK { public static void main(String[] args){ SparkConf conf = new SparkConf(); conf.setMaster("local"); conf.setAppName("wordTopK"); JavaSparkContext sc=new JavaSparkContext(conf); JavaRDD<String> fileRDD = sc.textFile("D:\\summer_study\\ppt\\hive.txt"); //使用flatmap算子对每一行数据按空格分隔,并将所有的字母都转为小写 //注意这里不用map是因为map只能输出一个数据元素,而flatMap可以在输入元素后添加任意多元素来输出, // 比如分割后的多个元素组成Iterator来输出,但是Iterator里的每一个元素依然是独立的RDD。 JavaRDD<String> wordRDD = fileRDD.flatMap(new FlatMapFunction<String, String>() { @Override public Iterator<String> call(String line) throws Exception { return Arrays.asList(line.toLowerCase().split("\\s+")).iterator(); } }); //使用maoToPair算子给每一个word加上计数标记1 JavaPairRDD<String, Integer> wordOneRDD = wordRDD.mapToPair(new PairFunction<String, String, Integer>() { @Override public Tuple2<String, Integer> call(String s) throws Exception { return new Tuple2<>(s,1); } }); //使用reduceByKey算子对word进行reduce聚合,为了根据key来排序,聚合后再将得到的pair里面的key和value调换一下 JavaPairRDD<Integer, String> wordCountRDD = wordOneRDD.reduceByKey(new Function2<Integer, Integer, Integer>() { @Override public Integer call(Integer integer, Integer integer2) throws Exception { return integer+integer2; } }).mapToPair(new PairFunction<Tuple2<String, Integer>, Integer, String>() { @Override public Tuple2<Integer, String> call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception { return new Tuple2<>(stringIntegerTuple2._2,stringIntegerTuple2._1); } }); //使用sortByKey算子排序,false降序,true升序 JavaPairRDD<Integer,String> sortWordCountRDD = wordCountRDD.sortByKey(false); //使用take算子取出前5 List<Tuple2<Integer,String>> result = sortWordCountRDD.take(5); System.out.println("结果:"+result.toString()); } }

浙公网安备 33010602011771号