Spark核心编程:高级编程之topn

Spark实现TopN 大数据实验教学系统练习 Spark实现TopN因为Spark RDD是分区并行计算的,因此要排序的话,需要指定一个分区。   使用sortByKey算子,按key排序,然后再使用take算子,取前几个元素,就得到了 Top N 的结果。掌握抓取文本中最大的前几位数字。   掌握排序算子的使用。1、使用Spark RDD实现 Top N。    假设我们有以下输入文件top.txt: 编写RDD代码,获取值最大的三个数(Top 3)。    2、使用Spark RDD实现分组 Top N。    假设我们有以 阅读详情

1.案例:对每个班级内的学生成绩,取出前3名

1>文件部分数据:
这里写图片描述
2>代码:
Java版:

import java.util.Arrays;
import java.util.Iterator;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;

import scala.Tuple2;

public class GroupTopN {

    @SuppressWarnings("unused")
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("GroupTopN")
                .setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        //读取数据
        JavaRDD<String> lines = sc.textFile("G://SparkDevel//test//wordCount//data//score.txt");
        //创建(class,score)元组
        JavaPairRDD<String, Integer> classScore = lines.mapToPair(
                new PairFunction<String, String, Integer>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Tuple2<String, Integer> call(String v1) throws Exception {
                String[] temp = v1.split(" ");
                return new Tuple2<String, Integer>(temp[0], Integer.valueOf(temp[1]));
            }
        });
        //按key=class来分类
        JavaPairRDD<String, Iterable<Integer>> sortedGroupPairs = classScore.groupByKey();
        //获取每个class的topN的分数,本例中N=3
        JavaPairRDD<String, Iterable<Integer>> sortedGroupTop3= sortedGroupPairs.mapToPair(
                new PairFunction<Tuple2<String,Iterable<Integer>>, String, Iterable<Integer>>() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public Tuple2<String, Iterable<Integer>> call(Tuple2<String, Iterable<Integer>> v1)
                            throws Exception {

                        Integer[] top3 = new Integer[3];

                        String className = v1._1;
                        Iterator<Integer> scores = v1._2.iterator();

                        while(scores.hasNext()) {
                            Integer score = scores.next();

                            for(int i = 0; i < 3; i++) {
                                if(top3[i] == null) {
                                    top3[i] = score;
                                    break;
                                } else if(score > top3[i]) {
                                    for(int j = 2; j > i; j--) {
                                        top3[j] = top3[j - 1];  
                                    }

                                    top3[i] = score;

                                    break;
                                } 
                            }
                        }

                            return new Tuple2<String, Iterable<Integer>>(v1._1, Arrays.asList(top3));
                    }
        });
        //打印已经分好类排好序的数据
        sortedGroupTop3.foreach(new VoidFunction<Tuple2<String,Iterable<Integer>>>() {
            private static final long serialVersionUID = 1L;

            @Override
            public void call(Tuple2<String, Iterable<Integer>> v1) throws Exception {
                System.out.println("class: " + v1._1);  
                Iterator<Integer> scoreIterator = v1._2.iterator();
                while(scoreIterator.hasNext()) {
                    Integer score = scoreIterator.next();
                    System.out.println(score);  
                }
                System.out.println("=======================================");   
            }

        });
        sc.close();
    }

}

Scala版:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import breeze.linalg.split
import scala.util.control.Breaks._
import sun.font.TrueTypeFont

object GroupTopN {
  def main(args: Array[String]){
    val conf = new SparkConf()
        .setAppName("GroupTopN")
        .setMaster("local")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("G://SparkDevel//test//wordCount//data//score.txt", 4);
    val classScores = lines.map(line => (line.split(" ")(0), line.split(" ")(1).toInt))
    val sortedGroup = classScores.groupByKey()

    val GroupTop3 = sortedGroup.map{
      v1 =>
        val N =3
        val topN = new Array[Int](N)
        val scores  = v1._2.iterator
        while (scores.hasNext) {
          val score = scores.next()
          breakable{
              for(i <- 0 until(N)){
                if(topN(i) == 0){
                  topN(i) = score
                  break
                }else if (score > topN(i)) {
                  for(j <- (i+1 until N).reverse){
                    topN(j) = topN(j-1)
                  }
                  topN(i) = score
                  break
                }
            }
          }
        } 
      (v1._1, topN)
    }

    GroupTop3.foreach{
      v1 =>
        println("class:" + v1._1)
        for(score <- v1._2){
          println(score)
        }
        println("===============")
    }
  }
}

结果:
这里写图片描述

Spark RDD实现分组求TopN 这会得到一个新的RDD,其中的元素是二元组,其中第一个元素是姓名,第二个元素是一个迭代器,包含与该姓名关联的所有成绩的二元组。该Scala代码使用了Apache Spark的RDD(弹性分布式数据集)API来处理一个文本文件,该文件包含按逗号分隔的姓名和成绩数据。因为每一行为一条数据,所以先构成(姓名,成绩)二元组,然后根据姓名进行分组,对组内数据按照降序排列,取前3个,最后按照输出语句打印结果。如果成绩是字符串形式的数字(例如"98","78"等),则需要确保它们是正确的数字格式以便进行准确的比较。 阅读详情

相关推荐

Spark【使用篇】05:TopN主播统计【使用spark中的transformation算子实现】

Spark【使用篇】05:TopN主播统计【使用spark中的transformation算子实现】

weixin_40612128的博客 430

聊一聊Spark实现TopN的几种方式

大家好,我是风云,欢迎大家关注我的个人原创公众号【笑看风云路】获取更多大数据技术干货,在未来的日子里我们一起来学习大数据相关的技术,一起努力奋斗,遇见更好的自己!

笑看风云路的博客 2398

[Spark应用]-- 实现分组取topN

一、文本格式 class1 90 class2 56 class1 87 class1 76 class2 88 class1 95 class1 74 class2 87 class2 67 class2 77 二、直接献上代码 package com.scala import org.apache.spark.SparkConf import org.apache.spark....

欢迎来到我的博客,一起探索代码里的世界! 5689

Spark实现分组排序TopN

分组排序TopN的第一种实现方式 (1)思路:先将rdd转换为key/value键值对类型的rdd,然后按照key对数据进行聚合,对同组key的所有value数据进行排序,对排序之后的value集合获取出现次数最多的前3个数据 // 缺点1:groupByKey这个API在现在这个版本的实现中,同组(相同key)的所有value全部加载到内存进行处理,当value特别多的时候就有可能出现OOM异常 // 缺点2:在对同组key数据进行聚合操作的业务场景中,groupByKey的性能有点低,groupB.

Mcharleylei的博客 1928

Apache Spark实现TopN算法实战指南

Apache Spark 是一个强大的分布式数据处理引擎,它提供了一个快速、通用的计算平台,广泛应用于大数据处理和分析。在数据处理领域,TopN问题是常见的一类问题,用于找出数据集中最靠前的N个元素。本章将对Spark框架进行简要介绍,并概述TopN任务的重要性和实现场景。Apache Spark 是由加州大学伯克利分校 AMP 实验室开发的一个开源项目,旨在提供一个高效、快速的分布式计算系统。它支持多种工作负载,包括批处理、迭代算法、交互式查询和流处理。

weixin_34511754的博客 1164

STM32F030F4P6实战:LL库+DMA驱动WS2812全流程(附避坑指南)

本文详细介绍了如何使用STM32F030F4P6的LL库和DMA驱动WS2812 LED灯带的全流程,包括硬件选型、CubeMX配置、LL库与DMA关键实现、数据格式转换及调试技巧。特别提供了避坑指南,帮助开发者避免常见错误,提升开发效率。

weixin_29194693的博客 484

Spark-分组TopN

Spark的分组TopN (1)自定义分区器,按照key进行分区,使不同的key进到不同的分区 (2)对每个分区运用spark的排序算子进行排序// 构造示例数据// 创建 JavaPairRDD// 自定义分区器,按照键进行分区// 对每个分区使用排序算子进行排序并获取 TopN 值// 指定要获取的 TopN 值的数量});// 打印结果sc.stop();// 自定义分区器@Overridereturn 3;// 指定分区数。

qq_40382400的博客 680

低代码Agent开发框架使用指南(二)—Coze平台核心功能概览

本篇分享系统介绍了字节跳动推出的低代码智能体开发平台Coze。Coze以免费易用、多模型支持和便捷的跨平台发布为核心优势,显著降低了智能体开发门槛。文章详细解析了平台的六大核心功能:扩展能力边界的插件系统、增强认知的知识库、结构化数据管理的数据库、可视化图像处理的图像流、实现复杂逻辑编排的工作流,以及处理复杂任务的多智能体协作机制,全面展现了Coze平台的强大能力。

weixin_42782643的博客 1358

Spark求TopN的多种方式

1. 将数据加载到内存中去TopN import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /** * 将数据加载到内存中进项排序取topn */ object Teacher01 { def main(args: Array[String]): Unit = { // 创建配置参数对象,进行参数配置 val conf = new SparkConf().setAppName

AnameJL的博客 2787

深度学习流体力学:基于PyTorch的物理信息神经网络(PINN)完整实现

本文介绍了基于物理信息神经网络(PINN)的深度学习流体力学求解器实现。首先阐述了Navier-Stokes方程的理论基础,包括连续性方程和动量守恒方程,并解释了PINN的核心原理:将物理方程作为约束条件嵌入神经网络损失函数。以经典的lid-driven cavity流动为例,详细展示了使用PyTorch实现的全流程,包括神经网络架构设计、自动微分求解Navier-Stokes方程、多约束条件优化训练等关键环节。该求解器通过将物理方程、边界条件和初始条件整合到损失函数中,实现了对流体力学问题的端到端求解,为

源代码杀手的博客 9839

定位分析RCU stall问题

在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.

happyAnger6的专栏 1994

Spark核心编程-分组取topN

案例需求 对每个班级内的学生成绩,取出前3名。(分组取topN)

Ganymede的Hadoop世界 5755

【Docker安装】OpenEuler系统下部署Docker环境

【Docker安装】OpenEuler系统下部署Docker环境

jks212454的博客 4191

Spark取TopN问题

数据处理中, 经常会遇到取TopN的问题. 在Spark中,取TopN有如下的方法: 生成rdd  读取数据源的数据并转为rdd. val rdd = sc.textFile() 分区 将rdd划分分区,分区的个数根据实际的数据量和计算集群机器的数量以及核心数确定. val partitionedRDD = rdd.coalesce(partitions) kv变换 把每条数据...

走向程序的康庄大道 2283

PyTorch实战(26)——PyTorch分布式训练

在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。我们将系统学习 PyTorch 提供的三大分布式训练 API——torch.distributed、torch.multiprocessing 以及 torch.utils.data.distributed.DistributedSampler,使用这些 API 能够极大的简化分布式训练,介绍如何使用 PyTorch 的分布式训练工具,在 CPU 和 GPU 上加速训练。

盼小辉丶的博客 3834

PLC模糊控制模糊PID(梯形图实现+算法分析)

博途PLC的模糊PID控制详细内容请查看下面的博客文章:Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_RXXW_Dor的博客-优快云博客模糊PID的其它相关数学基础,理论知识大家可以参看专栏的其它文章,这里不再赘述,本文就双容水箱的模糊PID问题做详细讲解(包括所有源代码和模糊规则设置参数)。

RXXW_Dor的博客 5884

Spark 核心之二次排序、分组取 TopN 优化分析

/ 按 classId 升序,score 降序if (cmp1!= 0) cmp1 else -this.score.compareTo(that.score) // score 降序// 使用.sortByKey() // 按自定义键全局排序方案Shuffle 量内存安全推荐度groupByKey100%❌ 高危⛔ 禁止10-30%⚠ 可控可用窗口函数10-30%✅ 最优⭐ 首选金句。

https://starzy1990.github.io/ 415

【100%通过率】华为OD机试真题 JS 实现【水库蓄水问题】【2023 Q1 | 100分】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 8173

29、Spark核心编程之高级编程之topn

需求1 对文本文件内的数字,取最大的前3个 Java实现 /** * 取最大的前3个数字 * */ public class Top3 { public static void main(String[] args) { SparkConf sparkConf = new SparkConf().setAppName("Top3Java").setMaster...

ZJ__ZFH的博客 1332

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spark核心编程与项目案例详解(二)

目录六、共享变量详解(1)Broadcast Variable工作原理详解(2)Accumulator工作原理详解(3)通过代码验证共享变量七、Spark之WordCount高级编程(1)使用Java语言实现(2)使用Scala语言实现八、二次排序案例实战(1)使用Java语言实现(2)使用Scala语言实现九、TopN案例实战(1)使用Java语言实现(2)使用Scala语言实现十、GroupTopN案例实战(1)使用Java语言实现(2)使用Scala语言实现 六、共享变量详解 Spark一个非常重要的

蔡政洁的博客 1074

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spark二次排序与分组TopN性能优化实战:从原理到调优

在大数据处理中,排序和分组取TopN是常见但易引发性能瓶颈的核心操作。其原理涉及数据分区、Shuffle机制和内存管理,不当实现会导致全量数据移动和严重的数据倾斜。通过优化Shuffle策略与内存使用,能显著提升作业效率,降低资源消耗。例如,利用repartitionAndSortWithinPartitions可避免全局排序,结合mapPartitions实现分区内高效计算;而aggregateByKey配合堆结构能在Map端进行局部聚合,大幅减少网络传输。这些技术对于实时报表、用户行为分析等需要快速获取

weixin_33158887的博客 289

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TopN 问题分析和单元实践训练

本文介绍了Spark中处理TopN问题的两种核心方法以及RDD的实践应用。对于TopN问题,可直接排序后取前N项(适用于小数据),或使用top()方法优化性能(适合大数据)。RDD实践部分展示了数据转换(元组处理、条件判断)、文本处理(过滤、转换、排序)等操作,并强调了延迟执行特性。最后以用户消费统计为例,演示了如何通过map解析字段、reduceByKey聚合数据来处理实际业务场景。全文包含多个代码示例,突出Spark的核心操作原理及应用技巧。

2502_90812910的博客 1688

Spark 核心编程(10)-Top N

1 TopN 1.1 对文件内数字,取最大的前 3 个 Java 版本 package topn; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark...

一角残叶的博客 515

Spark编程核心—2,RDD详解

目录Spark编程核心—2,RDD详解写一个spark应用程序的流程:常见的RDD算子Transformation算子Action算子RDD中一些值得注意的点1、缓存2、数据分区代码实战数据过滤-Scala 版统计每个页面的 UV二次排序-scala 版TopN 问题:找出每个班级中排名前三的分数-Java 版 Spark编程核心—2,RDD详解 写一个spark应用程序的流程: 1、 加载数据集...

weixin_42557275的博客 615

Spark Scala TopN分组排序

注意: groupBy和groupByKey是不同的,比如(A,1),(A,2);使用groupBy之后结果是(A,((A,1),(A,2))); 使用groupByKey之后结果是:(A,(1,2));关键区别就是合并之后是否会自动去掉key信息; 示例: 输入: Spark 95 Hadoop 68 Flink 55 Spark 95 Hadoop 98 Flink 85 Kafka

huitoukest的专栏 1万+

spark面试题总结

spark面试基础篇

Maynor的博客 8313
上一篇: Spark核心编程:高级编程之二次排序
下一篇: Spark内核源码深度剖析:Spark内核架构深度剖析
VectorYang
博客等级 码龄10年 17粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值