Spark实现TopN

简介: Spark实现TopN

1. 实验室名称:

大数据实验教学系统

2. 实验项目名称:

练习 Spark实现TopN

3. 实验学时:

4. 实验原理:

因为Spark RDD是分区并行计算的,因此要排序的话,需要指定一个分区。

 使用sortByKey算子,按key排序,然后再使用take算子,取前几个元素,就得到了 Top N 的结果。


5. 实验目的:

掌握抓取文本中最大的前几位数字。

 掌握排序算子的使用。


6. 实验内容:

1、使用Spark RDD实现 Top N。

  假设我们有以下输入文件top.txt:

1.  2
2.  6
3.  3
4.  67
5.  23
6.  45
7.  78
8.  12
9.  234

编写RDD代码,获取值最大的三个数(Top 3)。

  2、使用Spark RDD实现分组 Top N。

  假设我们有以下输入文件classdata.txt:

1.  class1 90
2.  class2 56
3.  class3 87
4.  class1 76
5.  class2 88
6.  class1 95
7.  class1 74
8.  class2 87
9.  class2 67
10. class2 77

编写RDD代码,获取每个班级的前三名(分组Top 3)。


7. 实验器材(设备、虚拟机名称):

硬件:x86_64 ubuntu 16.04服务器

 软件:JDK 1.8,Spark-2.3.2,Hadoop-2.7.3,zeppelin-0.8.1,Scala-2.11.11


8. 实验步骤:

8.1 启动Spark集群

在终端窗口下,输入以下命令,启动Spark集群:

1.  $ cd /opt/spark
2.  $ ./sbin/start-all.sh

然后使用jps命令查看进程,确保Spark的Master进程和Worker进程已经启动。


8.2 启动zeppelin服务器

在终端窗口下,输入以下命令,启动zeppelin服务器:

1.  $ zeppelin-daemon.sh start

然后使用jps命令查看进程,确保zeppelin服务器已经启动。


8.3 创建notebook文档

1、首先启动浏览器,在地址栏中输入以下url地址,连接zeppelin服务器。

http://localhost:9090

 2、如果zeppelin服务器已正确建立连接,则会看到如下的zeppelin notebook首页。

26c9ff07ac1749e1a82b328b6f7ae5f2.png


3、点击【Create new note】链接,创建一个新的笔记本,并命名为”rdd_demo”,解释器默认使用”spark”,如下图所示。

546795082bb7442282f7cffe336e6a80.png


8.4 Top N 实现

1、加载数据集。在zeppelin中执行如下代码。

1.  val inputPath = "file:///data/dataset/top.txt"
2.  val inputRDD = sc.textFile(inputPath)

将光标放在代码单元中任意位置,然后同时按下【shift+enter】键,执行以上代码。

 2、实现Top N,方法是先将每行的数字转换为元组,然后再执行sortByKey降序排序,最后使用take(3)方法取最前面的3个。在zeppelin中执行如下代码。

1.  // 读取文件。注意,这里指定一个RDD分区,以便全局排序
2.  val  lines = sc.textFile("file:///data/dataset/top.txt",1)
3.       
4.  // 对linesRDD进行map操作
5.  val  pairs = lines.map { line  => (line.toInt,line) }
6.       
7.  // 对pairsRDD进行降序sortByKey操作
8.  val  sortedPairs = pairs.sortByKey(false)
9.       
10. // 对降序的RDD再次进行map操作,获取每一行的第一个数   
11. val  sortedNumbers = sortedPairs.map(sortedPair => sortedPair._1)
12.      
13. // 取前3个数
14. val  top3Number = sortedNumbers.take(3)
15.      
16. // 打印输出
17. for(num <- top3Number){
18.      println(num)
19. }

将光标放在代码单元中任意位置,然后同时按下【shift+enter】键,执行以上代码。输出结果如下所示。

1.  234
2.  78
3.  67

8.5 分组 Top N 实现

1、加载数据集。在zeppelin中执行如下代码。

1.  val inputPath = "file:///data/dataset/classdata.txt"
2.  val inputRDD = sc.textFile(inputPath)

将光标放在代码单元中任意位置,然后同时按下【shift+enter】键,执行以上代码。

 2、实现Top N,方法是先将每行的数字转换为元组,然后再执行sortByKey降序排序,最后使用take(3)方法取最前面的3个。在zeppelin中执行如下代码。

1.  // 对获取的元素进行按空格切割成两部分    
2.  val pairs = inputRDD.map { line  => (line.split(" ")(0),line.split(" ")(1).toInt)  }
3.       
4.  // 对pairs中的每个元素进行按键分组操作
5.  val grouped=pairs.groupByKey
6.       
7.  // 对分组的元素按分数取前3    
8.  val groupedTop3=grouped.map(grouped=> {
9.      (grouped._1,grouped._2.toList.sortWith(_>_).take(3))
10.  })
11.      
12. // 进行降序排列(默认是降序)
13. val  groupedKeySorted = groupedTop3.sortByKey()
14.      
15. // 打印输出   
16. groupedKeySorted
17.   .collect
18.   .foreach(pair=>{
19.     println(pair._1+":")
20.     pair._2.foreach  { println }
21.   })

将光标放在代码单元中任意位置,然后同时按下【shift+enter】键,执行以上代码。输出结果如下所示。


1.  class1:
2.  95
3.  90
4.  76
5.  class2:
6.  88
7.  87
8.  77
9.  class3:
10. 87

9. 实验结果及分析:

实验结果运行准确,无误


10. 实验结论:

经过本节实验的学习,通过练习 Spark实现TopN,进一步巩固了我们的Spark基础。


11. 总结及心得体会:

使用sortByKey算子,按key排序,然后再使用take算子,取前几个元素,就得到了 Top N 的结果。


55886562e8404b50b34e1376284b9683.png

相关文章
|
分布式计算 Spark
|
分布式计算 Spark
【Spark 应用】实现分组取topN
【Spark 应用】实现分组取topN
204 0
|
24天前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
66 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
1月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
63 0
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
42 0
|
1月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
92 0
|
25天前
|
SQL 机器学习/深度学习 分布式计算
Spark快速上手:揭秘大数据处理的高效秘密,让你轻松应对海量数据
【10月更文挑战第25天】本文全面介绍了大数据处理框架 Spark,涵盖其基本概念、安装配置、编程模型及实际应用。Spark 是一个高效的分布式计算平台,支持批处理、实时流处理、SQL 查询和机器学习等任务。通过详细的技术综述和示例代码,帮助读者快速掌握 Spark 的核心技能。
50 6
|
23天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
79 2
|
24天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
61 1
|
25天前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
52 1

热门文章

最新文章

下一篇
无影云桌面