使用Spark对数据进行分组排序(Java和Scala实现)

对数据进行分组排序,首先对数据进行分组,然后对该组下的数据进行排序。

1.首先准备数据集,本次的数据集如下。

Chinese,90
Math,93
English,84
Computer,89
Chinese,83
English,79
Math,89
Computer,88
Chinese,86
English,82
Math,94
Computer,81

2.放码

 Java版


import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.SparkSession;

import scala.Tuple2;

public class GroupTop {

	public static void main(String[] args) {
		
		SparkConf conf = new SparkConf().setAppName("GroupTop").setMaster("local[*]");

		SparkSession spark = SparkSession.builder().config(conf).getOrCreate();
		
		JavaRDD<String> input = spark.read().textFile("dataset/groupTop.txt").javaRDD();
		
		JavaPairRDD<String, Integer> pairs = input.mapToPair(line -> {
			String arr[] = line.split(",");
			return new Tuple2<String, Integer>(arr[0], Integer.valueOf(arr[1]));
		});
		
		JavaPairRDD<String, Iterable<Integer>> group = pairs.groupByKey();
		
		JavaPairRDD<String, Iterable<Integer>> top2score = group.mapToPair(tuple -> {
			
			List<Integer> list = new ArrayList<Integer>();
			Iterator<Integer> it = tuple._2.iterator();
			while(it.hasNext()) {
				Integer score = it.next();
				list.add(score);
			}
			
			Collections.sort(list, (v1, v2) -> -(v1.compareTo(v2)));
			
			return new Tuple2<String, Iterable<Integer>>(tuple._1,list);
		});
		
		top2score.collect().forEach(System.out::println);
		
//		top2score.foreach(tuple -> {
//			System.out.println("city:" + tuple._1);
//			Iterator<Integer> it = tuple._2.iterator();
//			while(it.hasNext()) {
//				System.out.println(it.next());
//			}
//			
//			System.out.println("-----------------------");
//		});
		
	}
}

运行结果:

(Computer,[89, 88, 81])
(Math,[94, 93, 89])
(Chinese,[90, 86, 83])
(English,[84, 82, 79])

Scala版:


import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object GroupTopN {
  
  def main(args: Array[String]): Unit = {
    
    val conf = new SparkConf().setAppName("WordCountLocal") .setMaster("local[*]")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    
    val lines = spark.read.textFile("dataset/groupTop.txt").rdd
    
    val cores = lines.map(line => (line.split(",")(0),line.split(",")(1).toInt))
    val group = cores.groupByKey()
    val groupSort = group.map(css => {
      val c = css._1
      val ss = css._2
      val sortSorce = ss.toList.sortWith(_ > _)
      (c, sortSorce)
    })
    groupSort.foreach(println)
  }
}

运行结果:

(Computer,List(89, 88, 81))
(Math,List(94, 93, 89))
(Chinese,List(90, 86, 83))
(English,List(84, 82, 79))

大数据环境:

Spark 2.2.0

jdk1.8

可以看出,Scala的代码确实比Java少了很多,而且更简洁明了。


  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值