今日总结

统计一段文本里出现频率最高的前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());
    }
}

 

posted @ 2024-01-24 21:18  北·岛  阅读(16)  评论(0)    收藏  举报