【手把手 腦把腦】教會你使用idea基于MapReduce的統計數據分析(從問題分析到代碼編寫)

目錄

1 編程前總分析

1.1 數據源

1.2?需要掌握的知識

1.2.1 Hadoop對比java的數據類型

1.2.2 MapReduce流程簡介

?1.3.3?MapReduce流程細分

2 編碼階段

2.1 導入依賴

2.2?mapper

2.3?reducer

2.4?main


1 編程前總分析

1.1 數據源

英語,李沐,85,男,20
數學,李沐,54,男,20
音樂,李沐,54,男,20
體育,李沐,34,男,20
語文,李媛,81,女,20
音樂,李媛,85,女,20
體育,李媛,89,女,20
語文,馬珂,75,女,19
英語,馬珂,85,女,19
音樂,馬珂,75,女,19
體育,馬珂,65,女,19
語文,潘琴,42,女,20
英語,潘琴,48,女,20
音樂,潘琴,48,女,20
體育,潘琴,78,女,20
英語,秦燦,75,男,19
數學,秦燦,89,男,19
音樂,秦燦,85,男,19
體育,秦燦,99,男,19
語文,王靚,85,女,21
英語,王靚,85,女,21
數學,王靚,48,女,21
音樂,王靚,86,女,21
音樂,王靚,85,女,21
體育,王靚,96,女,21
體育,王靚,87,女,21
英語,吳起,85,男,20
數學,吳起,85,男,20
英語,張翔,96,男,20
數學,張翔,85,男,20
音樂,張翔,85,男,20
體育,張翔,87,男,20
語文,鄭虎,85,男,20
數學,鄭虎,85,男,20
音樂,鄭虎,88,男,20
體育,鄭虎,68,男,20
語文,周偉,76,男,19
英語,周偉,85,男,19
數學,周偉,76,男,19
音樂,周偉,99,男,19
體育,周偉,90,男,19
數學,朱鴻,90,男,21
音樂,朱鴻,80,男,21
體育,朱鴻,81,男,21

1.2?需要掌握的知識

1.2.1 Hadoop對比java的數據類型

javaHadoop
booleanBooleanWritable
Integer/intIntWritable
Long/longLongWritable
Float/floatFloatWritable
Double/doubleDoubleWritable
StringText
NullWritable

1.2.2 MapReduce流程簡介

? ? MapReduce是一種簡化的并行計算編程模型框架,主要解決了分布式計算的相關問題。所謂的分布式計算就是將一個文件里的數據內容,一行行的發送給mapper,mapper接收到一行數據使用split分割后接收,并按key分組后傳給reducer,reducer將接收到的一組數據進行處理后輸出,當所有的組都處理完成結束一個MapReduce。

?1.3.3?MapReduce流程細分

? ? 功能:統計每門課程中相同分數的人有多少及他們的名字

? ? 思考一下,想要統計每門課程中相同分數的人數及名字,我們需要以什么字段為標準對數據進行分組(mapper最主要的功能就是分組)?想要搞明白上面的問題,試著和mysql的分組查詢操作做一下類比,具體sql語句如下:

SELECT 姓名?FROM?表?GROUP?BY 課程名稱,成績?;

? ? 參考sql語句的分組查詢,mapper功能就相當于按課程和成績兩個字段值對數據進行分組并查詢學生姓名。mapper里的最后一句context.write(key,value);里的兩個參數,key等于GROUP?BY后面的字段名-->課程成績和成績的拼接字符串,value等于GROUP?BY前面的字段名-->姓名。mapper就實現了將所有key值相同的分為一組,value放在迭代器中,一組組傳給reducer,reducer使用一個Text類型的key和迭代器value進行接收。

2 編碼階段

????????mapreduce拆分:每個mapreduce程序都可以拆分成三個小部分mapper類、reducer類、main方法類。每個類都有其固定的框架,需要改變的就只有mapper和reducer類中重寫方法的方法體本身,還有main方法里面的各項參數值。

????????如果說,當然我的讀者肯定都是聰明的亞批,我是說如果你朋友的java編程基礎不是很好,我的注釋表示它完全可以很細。????????

2.1 導入依賴

????????MapReduce不需導入的四個依賴(hadoop-client、hadoop-hdfs、hadoop-common、hadoop-mapreduce-client-core)

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.7.3</version></dependency>
</dependencies>

2.2?mapper

package course_score_same;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*
stu[0]:課程名稱
stu[1]:學生姓名
stu[2]:成績
stu[3]:性別
stu[4]:年齡
該功能實現:統計該課程中成績相同的學生姓名*/
//Mapper的泛型依次為輸入文本的第幾行,該行的文本,Mapper的輸出key,Mapper的輸出value
public class CssMapper extends Mapper<LongWritable, Text,Text,Text> {
//重寫方法:在idea的代碼區使用快捷鍵 alt+insert選擇鼠標單擊override methods選擇map方法@Override//map方法的三個參數,前兩個就是輸入文本行號,該行的文本,最后一個Context context固定寫法protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {//將文件的每一行傳遞過來,使用split分割后利用字符數組進行接收String[] stu = value.toString().split(",");//拼接字符串:課程和成績String sc = stu[0]+"\t"+stu[2];//向Reducer傳遞參數-> Key:課程+成績 Value:學生名context.write(new Text(sc),new Text(stu[1]));}
}

2.3?reducer

package course_score_same;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;//Reducer的泛型依次為Mapper輸出的key作為Reducer的輸入,Mapper輸出的value作為Reducer的輸入,Reducer的輸出key,Reducer的輸出value
public class CssReducer extends Reducer <Text,Text,Text,Text>{
//重寫方法與Mapper一樣@Override//reduce方法的三個參數:Mapper輸出的key作為Reducer的輸入,Mapper輸出的value作為Reducer的輸入,最后一個Context context固定寫法protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//創建StringBuffer用來接收該課程中成績相同的學生的姓名StringBuffer sb = new StringBuffer();//num變量用來計數int num = 0;//遍歷values參數,將所有的value拼接進sb,并統計學生數量for(Text value:values){sb.append(value.toString()).append(",");num++;}//如果num=1,則表明該課程的這個成績只有一個學生,否則就輸出if(num>1){String names = "一共有" + num + "名學生,他們的名字是:" +sb.toString();System.out.println("*************************************************");System.out.println(key.toString() + names);context.write(key,new Text(names));}}
}

2.4?main

package course_score_same;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;public class CssMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//創建job和“統計相同課程相同分數的人數”任務入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(CssMain.class);//設置Mapper和Reducer的入口job.setMapperClass(CssMapper.class);job.setReducerClass(CssReducer.class);//設置Mapper的輸入輸出類型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//設置Reducer的輸入輸出類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);//指定輸入輸出路徑String inputPath = "hdfs://localhost:9000/mapreduce/input/學生成績.csv";String outputPath = "hdfs://localhost:9000/mapreduce/output/該課程中成績相同的學生姓名.txt";FileInputFormat.setInputPaths(job,new Path(inputPath));FileOutputFormat.setOutputPath(job,new Path(outputPath));//輸出路徑存在的話就刪除,不然就只能手動刪除,否則會報該文件已存在的異常FileSystem fileSystem = FileSystem.get(new URI(outputPath), conf);if (fileSystem.exists(new Path(outputPath))) {fileSystem.delete(new Path(outputPath), true);}//執行jobjob.waitForCompletion(true);}
}

????????至此,一個完整的MapReduce的編寫就已經完全結束了,如果想要別的功能,只需要修改mapper和reducer類中重寫方法的方法體本身,還有main方法里面的各項參數值即可。

? ? ? ? 為了進一步鍛煉大家MapReduce確定mapper輸出的key和value,下面再找兩個例子練習一下(每個人的想法都不一樣,所以說并沒有標準的答案,合理即可):

  • 統計所有學生的信息—>(key:姓名+性別+年齡;value:課程+成績)
  • 計算每門成績的最高分、最低分、平均分—>(key:課程名稱;value:成績)
  • 統計各性別的人數及他們的姓名—>(key:性別;value:姓名)

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

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

相關文章

【細節拉滿】Hadoop課程設計項目,使用idea編寫基于MapReduce的學生成績分析系統(附帶源碼、項目文件下載地址)

目錄 1 數據源(學生成績.csv) 2 hadoop平臺上傳數據源 3 idea代碼 3.1 工程框架 3.2 導入依賴 3.3 系統主入口(menu) 3.4 六個mapreduce 3.4.1 計算每門成績的最高分、最低分、平均分(Mma) 3.4.2 計算每個學生的總分及平均成績并進行排序(Sas) 3.4.3 統計所有學生的信…

【單位換算】存儲單位(bit Byte KB MB GB TB PB EB ZB YB BB)時間單位(ms μs ns ps)長度單位(dm cm mm μm nm pm fm am zm ym)

存儲單位 相鄰單位相差2?&#xff0c;記憶時可以此類推 一字節等于八比特 1 Byte 8 bit 1KB 1024 B 2? B 1MB 1024 KB 2? B 1GB 1024 MB 2? B 1TB 1024 GB 2?? B 1PB 1024 TB 2?? B 1EB 1024 PB 2?? B 1ZB 1024 EB 2?? B 1YB 1024 ZB 2?? B 1B…

Git 的安裝、使用、分支、命令 一篇博客全都學會

目錄 1 版本控制 1.1 什么是版本控制 1.2 為什么需要版本控制 2 Git概述 2.1 Git的工作機制 2.2 分布式版本控制工具與集中式的區別 2.3 Git是如何誕生的 3 Git的安裝 4 Git常用命令 4.1 用戶簽名的設置和修改 4.2 查看用戶簽名的設置 4.3 初始化本地庫 4.4 添加、…

生成一個GitHub的token用于git推送本地庫至遠程庫

1 一步步選擇設置 2 使用鏈接直接跳轉到最后一步的設置頁 git push 的時候需要token&#xff0c;所以在GitHub上生成一個臨時的token 1 一步步選擇設置 2 使用鏈接直接跳轉到最后一步的設置頁 前提是你已經在這個瀏覽器上登陸了GitHub https://github.com/settings/tokens

都2021年了,還不會使用GitHub創建、推送、拉取、克隆遠程庫、團隊協作開發?

1 對自己的遠程庫操作 1.1 在GitHub上創建遠程庫 1.2 推送本地庫至遠程庫 1.3 拉取遠程庫到本地庫 1.4 克隆遠程倉庫到本地 2 對別人的遠程庫兩種操作方式 2.1 使用GitHub進行團隊內協作開發 2.2 使用GitHub進行跨團隊協作開發 眾所周知&#xff0c;GitHub是一個大型的國…

2021 最新 IDEA集成Gitee、Gitee遷移GitHub【圖文講解】

1 創建遠程庫 2 IDEA集成Gitee 2.1 安裝gitee插件并綁定賬號 2.2 IDEA推送本地庫至遠程庫的兩種方式 2.3 修改后推送本地庫至遠程庫 2.4 拉取遠程庫 2.5 使用IDEA克隆遠程庫 3 Gitee遷移GitHub的遠程庫的兩種方式 3.1 自己的賬戶之間遷移 3.2 使用鏈接進行遷移 3.3 強制刷…

只需五步學會Maven 3.6.1OR 3.6.3及其他版本的下載安裝與配置【圖文詳解】

第一步&#xff0c;下載并解壓縮包 ?第二步&#xff0c;配置兩個環境變量 ?第三步&#xff0c;測試是否安裝成功 ?第四步&#xff0c;指定本地倉庫的路徑 第五步&#xff0c;修改鏡像倉庫 第一步&#xff0c;下載并解壓縮包 Maven官方下載地址&#xff1a;https://mav…

只需四步完成java JDK1.8的下載安裝與配置【圖文詳解】

第一步&#xff0c;下載安裝包并安裝 第二步&#xff0c;安裝JDK 第三步&#xff0c;配置三個環境變量 第四步&#xff0c;測試是否安裝成功 第一步&#xff0c;下載安裝包并安裝 Oracle的官方下載地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#ja…

從Maven中央倉庫網站下載jar包的兩種方式,將會伴隨java后端開發者的整個職業生涯

這個肥腸重要的網站就是&#xff1a;https://mvnrepository.com/ 下面我會以mysql-connector-java-8.0.26.jar為例&#xff0c;教會你使用兩種方式下載使用jar包資源 首先在搜索欄使用全稱或者是關鍵字對jar包進行搜索 選擇你想要的版本 方式一&#xff1a;導入pom文件依賴(…

2021 使用IDEA創建并編寫你的第一個Maven項目【圖文詳解】

1 使用IDEA創建你的第一個Maven項目 2 使用IDEA編寫一個Maven項目 1 使用IDEA創建你的第一個Maven項目 新建一個空白項目 File-->New-->Project-->Empty Project 在IDEA中配置JDK 在IDEA中配置Maven 新建一個Maven模塊 在test目錄下面新建一個resources文件夾 2 使…

能讓你的Intellij IDEA 起飛的幾個設置(設置背景 字體 快捷鍵 鼠標懸停提示 提示忽略大小寫 取消單行顯示)

1 設置主題(背景圖片) 2 設置字體 2.1 設置默認的字體及其大小、行間距**墻裂推薦** 2.2 設置字體大小可以隨意改變**墻裂推薦** 3 設置鼠標懸停提示 4 提示的時候忽略大小寫**墻裂推薦** ??5 取消單行顯示tabs**墻裂推薦** 6 修改類頭的文檔注釋信息 7 設置項目文…

控制臺:Unable to import maven project: See logs for details日志:Unable to create injector, see the follow

問題描述&#xff1a; 當我在使用IDEA 完成一個Maven項目的時候&#xff0c;在第一步的pom.xml文件導入依賴時就發生了這個問題&#xff0c;彈窗彈出Uable to import maven project 控制臺報 Unable to import maven project: See logs for details的異常。 既然人家都讓查看l…

Maven基礎教程

1 Maven簡介 2 Maven基礎概念 2.1 倉庫 2.2 坐標 3 依賴的相關知識點 4 生命周期與插件 5 使用Inteli idea完成第一個Maven項目 1 Maven簡介 Maven的本質就是一個項目管理工具&#xff0c;用于將項目開發和管理過程抽象成一個項目對象模型(project object model POM) Ma…

java實現編輯距離算法(levenshtein distance),計算字符串或者是文本之間的相似度【附代碼】

編輯距離算法其實就是&#xff0c;在規定的編輯操作(替換字符串、插入字符串、刪除字符串)中&#xff0c;經過幾步可以把一個字符串變成另一個字符串&#xff0c;而這個所需的步數就是你的編輯距離。 測試樣例&#xff1a; str1 abc str2 yabd 表里的每一個值都代表著將s…

【Java從入門到頭禿專欄 】(一)學在Java語法之前

目錄 1 初識Java 2 Java環境JDK 3 Java規范 1 初識Java Java是美國的sun(Stanford University Network)公司在1995年推出的一門計算機高級編程語言&#xff0c;雖然說當時參與開發Java的人員有好幾名&#xff0c;但是業內公認的Java之父是詹姆斯高斯林(James Gosling)。 Jav…

【Java從入門到頭禿專欄 】(二) 注釋 數據類型 變量 常量 關鍵字 標識符 運算符 輸入輸出

目錄 1 注釋 2 數據類型 3 變量與常量 4 關鍵字、標識符 5 運算符 6 鍵入值、輸出值 1 注釋 注釋就是寫在程序中對代碼進行解釋說明的文字&#xff0c;方便自己和其他人查看&#xff0c;以便大家更加容易理解程序。注釋雖然寫在程序中&#xff0c;但是并不參與程序的執行&#…

【Java從入門到頭禿專欄 】(三) 控制流程 Math Date DateFormat Calendar System BigDecimal Random

目錄 1 控制流程 2 Math類 3 Date類 4 DateFormat類 5 Calendar類(日歷類) 6 System類 7 BigDecimal類 8 Random類(隨機數) 1 控制流程 1.1 塊作用域 塊(即復合語句)就是指由若干條Java語句組成的語句&#xff0c;并用一條大括號括起來&#xff0c;并借此形式確定了變量…

IntelliJ IDEA最常用的一些快捷鍵,學會了室友還以為你在祖安對線

目錄 1 快速生成語句 1.1 main語句 1.2 輸出語句 1.3 流程控制語句 1.3.1 if判斷語句 1.3.2 while循環 1.3.3 for循環 1.3.4 數組、集合的循環操作 1.3.5 迭代器循環操作 1.4 對象實例化、定義變量 1.5 try-catch異常 2 快捷鍵 2.1 Ctrl系列 2.2 alt系列 2.2.1…

【Java從入門到頭禿專欄 6】語法篇(五) :多線程 線程池 可見、原子性 并發包 Lambda表達式

目錄 1 多線程 1.1 基本概念 1.2 創建線程的三種方式 1.4 解決線程安全問題的三種方法 1.5 線程通信 1.6 線程狀態 2 線程池 2.1線程池的概念 2.2 創建并提交任務 3 可見性 3.1 變量不可見性 3.2 變量不可見性的解決方案 4 原子性 4.1 原子性的概念 4.2 保證原…

【Java從入門到頭禿專欄 7】語法篇(六) :Lambda表達式(->) 方法引用(::) stream流

目錄 1 Lambda表達式( -> ) ? 2 方法引用( :: ) 3 Stream流 接下來介紹的三種語法叫&#xff1a;Lambda表達式 方法引用 stream流&#xff0c;這三種語法的使用要有特定條件&#xff0c;在一定條件下借助這三種語法可以使代碼十分簡單且優雅&#xff0c;但是不要舍本逐末…