RDD 專項練習

RDD 專項練習

現有分數信息文件 scores.txt

班級ID 姓名 年齡 性別 科目 成績
12 張三 25 男 chinese 50
12 張三 25 男 math 60
12 張三 25 男 english 70
12 李四 20 男 chinese 50
12 李四 20 男 math 50
12 李四 20 男 english 50
12 王芳 19 女 chinese 70
12 王芳 19 女 math 70
12 王芳 19 女 english 70
13 張大三 25 男 chinese 60
13 張大三 25 男 math 60
13 張大三 25 男 english 70
13 李大四 20 男 chinese 50
13 李大四 20 男 math 60
13 李大四 20 男 english 50
13 王小芳 19 女 chinese 70
13 王小芳 19 女 math 80
13 王小芳 19 女 english 70
需求如下:
1、一共有多少人參加考試?
2、一共有多少個大于、小于、等于20歲的人參加考試?
3、分別有多個男生和女生參加考試?
4、各個班有多少人參加考試?
5、語文和數學科目的平均成績是多少?
6、單個人平均成績是多少?
7、各班平均成績是多少?
8、各班男女生平均總成績是多少?
9、全校語文成績最高分是多少?
10、各班各個科目最高和最低成績是多少?
11、總成績大于 150 分的 12 班的女生有幾個?

一、預處理

定義一個內部case類用于存儲分數數據
創建SparkContext對象
讀取數據文件,跳過第一行(標題行),并映射為Score對象(附加年齡類型)

import org.apache.spark.rdd.RDD  
import org.apache.spark.{SparkConf, SparkContext}  object SparkRDD {  // 定義一個內部case類用于存儲分數數據  private case class Score(classId: Int, name: String, age: Int, gender: String, subject: String, score: Int, _type: String)  def main(args: Array[String]): Unit = {  // 創建Spark配置對象  val conf = new SparkConf()  .setAppName("spark_rdd") // 設置應用名稱  .setMaster("local[4]") // 設置運行模式為本地模式,并分配4個核心  // 獲取或創建SparkContext對象  val sc = SparkContext.getOrCreate(conf)  // 指定數據文件路徑  val path = "file:///D:\\myOwnProject\\spark_first\\data\\scores.txt"  // 讀取數據文件,跳過第一行(標題行),并映射為Score對象  val scores: RDD[Score] = sc.textFile(path, 4) // 讀取文件,分區數為4  .mapPartitionsWithIndex { // 對每個分區應用索引和迭代器  case (index, iterator) => if (index == 0) iterator.drop(1) else iterator // 如果是第一個分區,則跳過第一行  }  .mapPartitions( // 對每個分區應用映射操作  _.map(line => { // 對分區中的每一行進行處理  val a = line.split("\\s+") // 按空白字符分割每行  val age = a(2).toInt // 將年齡字段轉換為整數  val _type = age match { // 根據年齡設置類型  case age if age > 20 => "GT20" // 年齡大于20  case age if age == 20 => "EQ20" // 年齡等于20  case age if age < 20 => "LT20" // 年齡小于20  }  // 構造Score對象  Score(a(0).toInt, a(1), a(2).toInt, a(3), a(4), a(5).toInt, _type)  })  ).cache() // 將RDD緩存到內存中,優化:RDD結果被不斷使用// 打印所有處理后的Score對象  scores.foreach(println)  //程序結束時停止SparkContext  sc.stop()  }  
}

二、處理需求

1、一共有多少人參加考試?

val count1 = scores.mapPartitions(_.map(_.name))	// scores如上預處理,下同.distinct().count()println(s"${count1} 人參加考試")			//6人參加考試

2、一共有多少個大于、小于、等于20歲的人參加考試?

val map = Map(("GT20", "20歲以上"), ("EQ20", "20歲"), ("LT20", "20歲以下"))
scores.mapPartitions(_.map(s => ((s.name, s._type), 1))).groupByKey().mapPartitions(_.map(s => (s._1._2, 1))).reduceByKey(_ + _).foreach(s => println(s"${map.get(s._1).get}的人數為${s._2}"))
/*
20歲以上的人數為2
20歲以下的人數為2
20歲的人數為2
*/

3、分別有多個男生和女生參加考試?

scores.mapPartitions(_.map(s => ((s.name, s.gender), 1))).groupByKey().mapPartitions(_.map(s => (s._1._2, 1))).reduceByKey(_ + _).foreach(s => println(s"${s._1}生參加考試的人數為${s._2}"))
/*
男生參加考試的人數為4
女生參加考試的人數為2
*/

4、各個班有多少人參加考試?

注意同班,同名去重

方法一:groupByKey 去重

scores.mapPartitions(_.map(s => ((s.name, s.classId), 1))).groupByKey().mapPartitions(_.map(s => (s._1._2, 1))).reduceByKey(_ + _).foreach(s => println(s"${s._1}班參加考試的人數為${s._2}"))
/*
12班參加考試的人數為3
13班參加考試的人數為3
*/

方法二:distinct去重(不推薦)

scores.mapPartitions(_.map(t=>(t.classId, t.name))).distinct().map(s => (s._1, 1)).reduceByKey(_+_).foreach(s => println(s"${s._1}班參加考試的人數為${s._2}"))

5、語文數學科目的平均成績是多少?

scores.mapPartitions(_.collect({	 	// 存在非語數外科目,如何過濾case s if s.subject.matches("chinese|math") => (s.subject, s.score)})).groupByKey().map(t => (t._1, t._2.sum * 1.0f / t._2.size)).foreach(s => println(s"${s._1}平均分:${s._2}"))

6、單個人平均成績是多少?

scores.mapPartitions(_.map(t=>(t.name,t.score))).groupByKey().map(t=>(t._1,t._2.sum*1.0f/t._2.size)).foreach(println)

7、各班平均成績是多少?

scores.mapPartitions(_.map(t=>(t.classId,t.score))).groupByKey().map(t=>(t._1,t._2.sum*1.0f/t._2.size)).foreach(println)

8、各班男女生平均總成績是多少?

scores.mapPartitions(_.map(t=>((t.classId,t.gender),t.score))).groupByKey().map(t=>(t._1,t._2.sum*1.0f/t._2.size)).foreach(println)

9、全校語文成績最高分是多少?

val chineseMax = scores.mapPartitions(_.filter(_.subject.equals("chinese")).map(_.score)).max()
println(s"最高語文成績為${chineseMax}")

10、各班各個科目最高和最低成績是多少?

scores.mapPartitions(_.map(s => ((s.subject, s.classId), (s.score, s.score)))
)
.reduceByKey((s1, s2) => (if (s1._1 > s2._1) s1._1 else s2._1, (if (s1._2 < s2._2) s1._2 else s2._2))
)
.foreach(s => println(s"${s._1._2}${s._1._1}科目的最大成績為${s._2._1},最小成績為${s._2._2}"))

結果

13班chinese科目的最大成績為70,最小成績為50
12班english科目的最大成績為70,最小成績為50
12班chinese科目的最大成績為70,最小成績為50
13班english科目的最大成績為70,最小成績為50
12班math科目的最大成績為70,最小成績為50
13班math科目的最大成績為80,最小成績為60

11、總成績大于 150 分的 12 班的女生有幾個?

val count2 = scores.mapPartitions(_.filter(s => s.gender == "女" && s.classId == 12).map(s => (s.name, s.score))).reduceByKey(_ + _).filter(s => s._2 > 150).count()
println(s"總成績大于 150 分的 12 班的女生有${count2}個")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44965.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FPGA-Verilog-Vivado-軟件使用

這里寫目錄標題 1 軟件配置2 FPGA-7000使用2.1 運行啟動方式 1 軟件配置 編輯器綁定為Vscode&#xff0c;粘貼VS code運行文件的目錄&#xff0c;后綴參數保持不變&#xff1a; 如&#xff1a; D:/Users/xdwu/AppData/Local/Programs/Microsoft VS Code/Code.exe [file name]…

從技術到管理:你必須知道的七個轉變

在職業生涯的道路上&#xff0c;很多技術骨干會逐步轉向管理崗位。這不僅是職位的晉升&#xff0c;更是角色、思維和能力的全方位轉變。以下是七個關鍵的轉變&#xff0c;幫助技術人員順利完成這一跨越。 一、從個人貢獻者到團隊領導者的轉變 在技術崗位上&#xff0c;成功往…

(19)夾鉗(用于送貨)

文章目錄 前言 1 常見的抓手參數 2 參數說明 前言 Copter 支持許多不同的抓取器&#xff0c;這對送貨應用和落瓶很有用。 按照下面的鏈接&#xff08;或側邊欄&#xff09;&#xff0c;根據你的設置了解配置信息。 Electro Permanent Magnet v3 (EPMv3)Electro Permanent M…

bug記錄 qInstallMessageHandler的使用

QT (純C)項目 ‘Qxxx‘ file not found 和 編譯報錯問題(已解決)_qt頭文件file not found-CSDN博客 qInstallMessageHandler&#xff08;指針函數參數&#xff09; 需要靜態指針&#xff0c;這個函數 #include <iostream> #include "singleton.h" #include &…

Linux操作系統CentOS如何更換yum鏡像源

簡介 CentOS&#xff0c;是基于Red Hat Linux提供的可自由使用源代碼的企業級Linux發行版本&#xff1b;是一個穩定&#xff0c;可預測&#xff0c;可管理和可復制的免費企業級計算平臺。 下載地址: centos安裝包下載_開源鏡像站-阿里云 相關倉庫&#xff1a; CentOS過期源&…

職業教育人工智能實驗實訓室建設應用案例

隨著人工智能技術的快速發展&#xff0c;其在職業教育領域的應用逐漸深入。唯眾作為一家專注于教育技術領域的企業&#xff0c;積極響應國家關于人工智能教育的政策號召&#xff0c;通過建設人工智能實驗實訓室&#xff0c;為學生提供了一個實踐操作與創新思維相結合的學習平臺…

C++ STL iter_swap用法和實現

一&#xff1a;功能 交換兩個迭代器指向的元素值&#xff0c;一般用在模板中 二&#xff1a;使用 #include <vector> #include <iostream>template <typename It, typename Cond>requires std::forward_iterator<It> && std::indirectly_swa…

富格林:曝光糾正安全交易誤區

富格林指出&#xff0c;貴金屬投資是許多投資者追求資產多樣化和風險管理的重要途徑。然而&#xff0c;正如任何投資領域一樣&#xff0c;不少投資者也對貴金屬投資產生了一些誤區和錯誤觀念。但事實上&#xff0c;如果這種誤區一直伴隨著我們的交易進程&#xff0c;是很難做到…

34 超級數據查看器 關聯圖片

超級數據查看器app&#xff08;excel工具&#xff0c;數據庫軟件&#xff0c;表格app&#xff09; 關聯圖片講解 點擊 打開該講的視頻 點擊訪問app下載頁面 豌豆莢 下載地址 大家好&#xff0c;今天我們講一下超級數據查看器的關聯圖片功能 這個功能能讓表中的每一條信息&…

數據結構-散列表(hash table)

6.1 散列表的概念 散列表又叫哈希&#xff08;hash&#xff09;表&#xff0c;是根據鍵&#xff08;key&#xff09;直接訪問在內存存儲位置的值&#xff08;value&#xff09;的數據結構&#xff0c;由數組演化而來&#xff08;根據數組支持按照下標進行隨機訪問數據的特性&a…

windows腳本獲取 svn版本號

簡介 需要使用項目中svn的最新版本號 命令 set svnURL"URL" svn info %svnURL% | findstr "Revision:" > Version.txt for /f "token2 delims " %%i in (Version.txt) do set rev%%i echo %rev% pause

力扣爆刷第163天之TOP100五連刷81-85(回文鏈表、路徑和、最長重復子數組)

力扣爆刷第163天之TOP100五連刷81-85&#xff08;回文鏈表、路徑和、最長重復子數組&#xff09; 文章目錄 力扣爆刷第163天之TOP100五連刷81-85&#xff08;回文鏈表、路徑和、最長重復子數組&#xff09;一、234. 回文鏈表二、112. 路徑總和三、169. 多數元素四、662. 二叉樹…

洛谷 B4006 [GESP202406 四級] 寶箱

題目描述 小楊發現了 &#x1d45b; 個寶箱&#xff0c;其中第 &#x1d456; 個寶箱的價值是 &#x1d44e;&#x1d456;?。 小楊可以選擇一些寶箱放入背包并帶走&#xff0c;但是小楊的背包比較特殊&#xff0c;假設小楊選擇的寶箱中最大價值為 &#x1d465;&#xff0c…

next input代碼嘗試編寫

使用有限狀態機&#xff08;FSM&#xff09;可以使代碼結構更清晰&#xff0c;特別是處理復雜的狀態和過渡時。以下是如何根據你提供的步驟&#xff0c;用有限狀態機來實現自動校準和中斷觸發邏輯的示例代碼。 狀態定義 IDLE: 空閑狀態&#xff0c;等待數據輸入。CALIBRATING…

Python高級(三)_正則表達式

Python高級-正則表達式 第三章 正則表達式 在開發中會有大量的字符串處理工作,其中經常會涉及到字符串格式的校驗。 1、正則表達式概述 正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、…

PostgreSql中的JSON數據類型

PostgreSQL 提供了兩種 JSON 數據類型&#xff1a;JSON 以及 JSONB。這兩種類型主要的區別在于數據存儲格式&#xff0c;JSONB 使用二進制格式存儲數據&#xff0c;更易于處理。 PostgreSQL 推薦優先選擇 JSONB 數據類型。 兩種數據類型之間的區別&#xff1a; 功能JSONJSONB存…

網絡建設與運維23國賽網絡運維正式賽題解析

競賽環境請看主頁&#xff01; 23國賽網絡運維 任務描述&#xff1a;某集團公司在更新設備后&#xff0c;路由之間無法正常通信&#xff0c;請修 復網絡達到正常通信。 &#xff08;1&#xff09; 請在server1“管理員”下拉菜單中選擇“鏡像”選項卡&#xff0c;點 擊 “創…

超聲波眼鏡清洗機有用嗎?四大主流超聲波清洗機品牌整理測評

長期佩戴的眼鏡&#xff0c;若不定期清洗&#xff0c;不僅鏡片會逐漸積聚油脂、灰塵&#xff0c;影響透光率&#xff0c;使視物模糊&#xff0c;更嚴重的是&#xff0c;眼鏡上日益增加的微小雜質和細菌可能會逐漸影響到眼睛健康&#xff0c;導致視力下降、眼部疾病等問題。 這…

Go 1.19.4 函數-Day 08

1. 函數概念和調用原理 1.1 基本介紹 函數是基本的代碼塊&#xff0c;用于執行一個任務。 Go 語言最少有個 main() 函數。 你可以通過函數來劃分不同功能&#xff0c;邏輯上每個函數執行的是指定的任務。 函數聲明告訴了編譯器函數的名稱&#xff0c;返回類型&#xff0c;和參…

STM32 - PWR 筆記

PWR&#xff08;Power Control&#xff09;電源控制 PWR 負責管理 STM32 內部的電源供電部分&#xff0c;可以實現 可編程電壓監測器 和 低功耗模式 的功能 可編程電壓監測器&#xff08;PVD&#xff09;可以監控VDD電源電壓&#xff0c;當VDD下降到PVD閥值以下或上升到PVD…