java8实现spark wordcount并且按照value排序输出

本文介绍如何使用Java 8的函数式编程特性结合Spark API实现WordCount,并对结果进行排序输出。通过实例展示了从读取文件到处理数据再到最终排序输出的全过程。

最近在学习spark,本来应该是使用scala编程,但是无奈scala没接触过,还得学,就先使用java的spark api练练手,其实发现java8的函数式编程跟scala很多地方异曲同工啊,搞定spark的java api后面学scala应该事半功倍!
最开始当然是万年不变的wordcount,加了个排序输出,具体看注释(^o^)/

SparkConf conf = new SparkConf().setMaster("local").setAppName("word count");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile("xxx.txt");
//使用java8提供的lambda表达式
//一句可以完成wordcount
JavaPairRDD<String, Integer> counts = 
    lines
    //根据'\001'分割来源行
    .flatMap(line -> Arrays.asList(line.split("\\001")).iterator())
    //map输出 (单词,1)
    .mapToPair(w -> new Tuple2<String, Integer>(w, 1)) 
    //通过reduce相同key,value值相加
    .reduceByKey((x, y) -> x + y); 

//根据得到的value值排序而不是key,默认只提供了根据key排序
//那么想到的思路是,交换key、value,进行key排序,交换回来,完成value排序
counts
    //交换key-value,注意类型
    .mapToPair(s -> new Tuple2<Integer, String>(s._2, s._1))
    //倒序
    .sortByKey(false)
    //交换key-value,注意类型
    .mapToPair(s -> new Tuple2<String, Integer>(s._2, s._1))
    //转成集合
    .collect()
    //输出
    .forEach(tuple -> System.out.println(tuple._1() + ": " + tuple._2()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值