Spark核心编程-分组取topN
来源:互联网 发布:淘宝店哪个店佛珠好 编辑:程序博客网 时间:2024/06/05 05:00
案例需求
输出:
在实现group by 后的排序算法,用到了break函数.
对每个班级内的学生成绩,取出前3名。(分组取topN)
输入测试数据(以“ ”以做分割符)
class1 90class2 56class1 87class1 76class2 88class1 95class1 74class2 87class2 67class2 77class1 98class2 96
实现如下:
1 、scala的版本
package com.spark.coreimport org.apache.spark.SparkConfimport org.apache.spark.SparkContextimport scala.collection.mutable.ArrayBufferimport scala.util.control.Breaks._/** * @author Ganymede */object GroupTop3 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Top3").setMaster("local[1]") val sc = new SparkContext(conf) val lines = sc.textFile("D:/scala-eclipse/workspace/spark-study-java/src/main/resources/score.txt", 1) val pairs = lines.map { x => { val splited = x.split(" ") (splited(0), splited(1).toInt) } } val groupedPairs = pairs.groupByKey(); val top3Score = groupedPairs.map(classScores => { val top3 = Array[Int](-1, -1, -1) val className = classScores._1 val scores = classScores._2 for (score <- scores) { breakable { for (i <- 0 until 3) { if (top3(i) == -1) { top3(i) = score; break; } else if (score > top3(i)) { var j = 2 while (j > i) { top3(j) = top3(j - 1); j = j - 1 } top3(i) = score; break; } } } } (className, top3); }) top3Score.foreach(x => { println(x._1) val res = x._2 for (i <- res) { println(i) } println("==========================") }) }}
输出:
class1989590==========================class2968887==========================
在实现group by 后的排序算法,用到了break函数.
scala没有提供类似于java的break语句。但是可以使用boolean类型变量、return或者Breaks的break函数来替代使用。
2、用spark-sql来实现
创建一个表
create table scores(className string, score int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '加载数据
load data local inpath '/opt/software/tmp/scores.data' overwrite into table scores;
查询按班级分组并返回倒序的top3
select className,score from (SELECT className,score, Row_Number() OVER (partition by className ORDER BY score desc ) rank FROM scores ) a where a.rank<=3;实际就是用了 row_number() over (partition by ... order by ...)的函数。同样hive也是支持的
3、总结:实际生产中,大部分还是用SQL来分析与统计的,明显方便一条SQL搞定了;而代码实现更灵活,便于性能的优化。
3 0
- Spark核心编程-分组取topN
- spark中实现分组取topN
- Spark Scala 分组排序取TopN
- Spark Java 分组排序取TopN
- 使用RDD解决spark TopN问题:分组、排序、取TopN
- Spark核心编程:高级编程之topn
- Spark--分组TopN
- Spark Scala TopN分组排序
- 使用Spark core和SparkSQL的窗口函数分别实现分组取topN的操作
- 使用Spark core和SparkSQL的窗口函数分别实现分组取topN的操作
- Hive TopN+分组TopN
- Hive TopN+分组TopN
- spark学习笔记之spark core 取topN
- spark学习笔记之spark core 取topN
- Spark--TopN
- MySQL分组然后取每个分组中按照某些字段排序的topN条数据
- hive 分组topN
- mysql 分组topN
- Android实现emoji
- 71.快速集成下拉刷新--MJRefresh
- --SQL正则替换函数
- 从朴素贝叶斯分类器到贝叶斯网络(下)
- iOS小技巧16-iOS/iPhone/Mac OS X版本历史
- Spark核心编程-分组取topN
- MVC4 文件上传的两种方式,默认提交表单方式和AJAX异步方式(精华)
- 使用栈实现括号匹配
- mycncart操作使用教程 - 模组
- 2015年个人总结
- android Audio 详解( 一 )
- grub rescue问题解决
- mycncart操作使用教程 - 文章管理
- 格式化数据#1:数据存储|Database