Scala编写Spark分组后排序取TOP n的代码

1、首先来练习最简单的一种情况,数据如下所示,我们要先进行分组然后取每组中的最大值

1 89
2 100
2 92
1 80
1 90

具体代码:

//两列数据
  def top_1(): Unit = {
    val sc = TransformationOperation.getSc("groupByKey2Top")
    val lines = sc.textFile("D:\\data\\testdatas\\spark\\group2top.txt")
    lines
      .map(line => (line.split(" ")(0).toInt, line.split(" ")(1).toInt))
      //按第一列进行分组
      .groupByKey()
      .foreach(line => {
        //将每组的value转化为list进行排序
        val arrs = line._2
        val list = arrs.toList.sorted.reverse
        println(line._1 + "组最大值:" + list(0))
      })
  }

输出:

1组最大值:90
2组最大值:100

******************************************************************************************

2、第二种情况的数据如下:第一列:科目,第二列:名字,第三列:分值。

需求:求出每科的最高分(包含名字)

A zs 90
B ww 100
A ls 100
C hr 80
C js 100
B wk 60

具体代码:

// three columns
  def top_2(): Unit = {
    val sc = TransformationOperation.getSc("groupByKey2Top")
    val lines = sc.textFile("D:\\data\\testdatas\\spark\\group2top2.txt")
    val categoryRdd = lines.map(line => {
      val category = line.split(" ")(0)
      val name = line.split(" ")(1)
      val score = line.split(" ")(2).toInt
      new Tuple2[String, Tuple2[String, Integer]](category, new Tuple2[String, Integer](name, score))
    }).groupByKey()
    /** categoryRdd
      * (B,CompactBuffer((ww,100), (wk,60)))
      * (A,CompactBuffer((zs,90), (ls,100)))
      * (C,CompactBuffer((hr,80), (js,100)))
      */
    val result = categoryRdd.map(x => {
      val category = x._1
      val scoreInfos = x._2
      var lists = List[(String, Integer)]()
      for (i <- scoreInfos) {
        val name = i._1
        val score = i._2
        lists = ((name, score)) :: lists
      }
      lists = lists.sortBy(_._2).reverse.take(1)
      new Tuple2[String, Iterable[(String, Integer)]](category, lists)
    })
    result.foreach(println(_))
  }

输出结果:

(B,List((ww,100)))
(A,List((ls,100)))
(C,List((js,100)))

*********************************************手动分割线****************************************************

实现的方式很多,在第二种情况我尝试过 sc.parallelize(lists).... 来代替lists = lists.sortBy(_._2).reverse.take(1)将集合zhuan转化为RDD进行操作,不过因为lists的原因报错了,暂时没找到合适的解决办法,有兴趣的也可以试试然后来帮我解答解答疑惑


欢迎加群大家一起学习大数据~群里还有很多资料可供参考~

大数据大佬菜鸡交流群 575419003

实验报告 1. 项目背景和目的 本项目旨在使用ScalaSpark对药品销售数据进行分析,并探索药品销售数据的相关模式和趋势。在这个项目中,我们使用了一个简单的药品销售数据集,包含以下信息: 1. 日期 2. 产品ID 3. 区域ID 4. 销售额 我们的目标是使用ScalaSpark对这个数据集进行分析,以了解以下信息: 1. 每个产品的总销售额 2. 每个地区的总销售额 3. 最受欢迎的产品和地区 2. 数据处理 我们使用Spark SQL库加载药品销售数据,并使用Spark SQL的group by和agg函数计算每个产品和每个地区的总销售额,并使用orderBy函数按降序排序结果。下面是数据处理的代码: ```scala import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object PharmaSalesAnalysis { def main(args: Array[String]): Unit = { // create a SparkSession val spark = SparkSession.builder() .appName("PharmaSalesAnalysis") .master("local[*]") .getOrCreate() // load the sales data val salesDF = spark.read .option("header", "true") .option("inferSchema", "true") .csv("sales_data.csv") // display the schema salesDF.printSchema() // calculate total sales by product val totalSalesByProduct = salesDF.groupBy("product") .agg(sum("sales").alias("total_sales")) .orderBy(desc("total_sales")) // display the top selling products totalSalesByProduct.show() // calculate total sales by region val totalSalesByRegion = salesDF.groupBy("region") .agg(sum("sales").alias("total_sales")) .orderBy(desc("total_sales")) // display the top selling regions totalSalesByRegion.show() // stop the SparkSession spark.stop() } } ``` 3. 结果分析 使用上述代码,我们可以得到以下结果: 1. 每个产品的总销售额 | product | total_sales | |---------|-------------| | P2 | 775 | | P1 | 683 | | P3 | 539 | | P4 | 509 | | P5 | 454 | 2. 每个地区的总销售额 | region | total_sales | |--------|-------------| | R3 | 1288 | | R4 | 1072 | | R2 | 1057 | | R5 | 1023 | | R1 | 901 | 3. 最受欢迎的产品和地区 最受欢迎的产品是P2,最受欢迎的地区是R3。 4. 结论 使用ScalaSpark对药品销售数据进行分析,我们可以得到以下结论: 1. P2是最畅销的产品,R3是最受欢迎的地区。 2. 药品销售数据中存在一些产品和地区的差异。了解这些差异可以帮助制定更精确的销售策略。 3. 通过使用ScalaSpark对大型数据集进行分析,我们可以更快地获得有关数据集的有用信息。 5. 可以改进的地方 本项目只是一个简单的示例,可以改进的地方包括: 1. 使用更多的数据,以获得更全面的数据分析结果。 2. 尝试使用更复杂的算法和技术,以获得更深入的数据分析结果。 3. 可以将分析结果可视化,以便更好地理解数据集。 6. 总结 在本项目中,我们使用ScalaSpark对药品销售数据进行了分析,并得出了一些结论。通过使用ScalaSpark对大型数据集进行分析,我们可以更快地获得有关数据集的有用信息,从而制定更精确的销售策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值