Hadoop-11-MapReduce JOIN 操作的Java實現 Driver Mapper Reducer具體實現邏輯 模擬SQL進行聯表操作

章節內容

上一節我們完成了:

  • MapReduce的介紹
  • Hadoop序列化介紹
  • Mapper編寫規范
  • Reducer編寫規范
  • Driver編寫規范
  • WordCount功能開發
  • WordCount本地測試

背景介紹

這里是三臺公網云服務器,每臺 2C4G,搭建一個Hadoop的學習環境,供我學習。
之前已經在 VM 虛擬機上搭建過一次,但是沒留下筆記,這次趁著前幾天薅羊毛的3臺機器,趕緊嘗試在公網上搭建體驗一下。

注意,如果你和我一樣,打算用公網部署,那一定要做好防火墻策略,避免不必要的麻煩!!!
請大家都以學習為目的,也請不要對我的服務進行嗅探或者攻擊!!!

但是有一臺公網服務器我還運行著別的服務,比如前幾天發的:autodl-keeper 自己寫的小工具,防止AutoDL機器過期的。還跑著別的Web服務,所以只能擠出一臺 2C2G 的機器。那我的配置如下了:

  • 2C4G 編號 h121
  • 2C4G 編號 h122
  • 2C2G 編號 h123

在這里插入圖片描述

業務需求

平常我們在業務上,有很多時候表都是分開的,通過一些 id 或者 code 來進行關聯。
在大數據的情況下,也有很多這種情況,我們需要進行聯表操作。

表1

項目編碼projectCode 項目名projectName

表2

項目編碼projectCode 項目類型projectType 項目分類projectFrom

SQL 中,可以通過 LEFT JOIN 來實現字段補齊。大數據下,也需要進行這樣的操作,我們需要借助 MapReduce

表1測試

"8aea9ba2-435c-48bd-9751-1cbd4c344d4e"	"社區項目1"
"02d9c090-e467-42b6-9c14-52cacd72a4a8"	"社區項目2"
"244dcaca-0778-4eec-b3a2-403f8fac1dfb"	"智慧社區"
"94befb97-d1af-43f2-b5d5-6df9ce5b9393"	"公交站點"
"f44c8d10-bc92-4398-ad9b-8c11dd48ad7c"	"街道布建"
"2e556d83-bb56-45b1-8d6e-00510902c464"	"街道公交站點"
"3ba00542-eac9-4399-9c2b-3b06e671f4c9"	"未命名項目1"
"5a5982d7-7257-422f-822a-a0c2f31c28d1"	"未命名項目2"

表2測試

"8aea9ba2-435c-48bd-9751-1cbd4c344d4e"	"重要類型"	"種類1"
"02d9c090-e467-42b6-9c14-52cacd72a4a8"	"重要類型"	"種類1"
"244dcaca-0778-4eec-b3a2-403f8fac1dfb"	"重要類型"	"種類1"
"94befb97-d1af-43f2-b5d5-6df9ce5b9393"	"普通類型"	"種類1"
"f44c8d10-bc92-4398-ad9b-8c11dd48ad7c"	"普通類型"	"種類2"
"2e556d83-bb56-45b1-8d6e-00510902c464"	"普通類型"	"種類2"
"3ba00542-eac9-4399-9c2b-3b06e671f4c9"	"一般類型"	"種類2"
"5a5982d7-7257-422f-822a-a0c2f31c28d1"	"一般類型"	"種類2"

SQL連表

假設我們使用SQL的方式聯表:

SELECT*
FROMt_project
LEFT JOINt_project_info
ONt_project.projectCode=t_project_info.projectCode

Reduce JOIN

有時候,表可能過大,無法支持我們使用 SQL 進行連表查詢。
這里我們編寫一個程序來完成操作。

ProjectBean

這里是最終的Bean類,里邊是兩個表把字段補齊的結果,一會兒我們將使用這個類進行表的連接。

package icu.wzk.demo03;import org.apache.hadoop.io.Writable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;public class ProjectBean implements Writable {private String projectCode;private String projectName;private String projectType;private String projectFrom;private String flag;@Overridepublic void write(DataOutput dataOutput) throws IOException {dataOutput.writeUTF(projectCode);dataOutput.writeUTF(projectName);dataOutput.writeUTF(projectType);dataOutput.writeUTF(projectFrom);dataOutput.writeUTF(flag);}@Overridepublic void readFields(DataInput dataInput) throws IOException {this.projectCode = dataInput.readUTF();this.projectName = dataInput.readUTF();this.projectType = dataInput.readUTF();this.projectFrom = dataInput.readUTF();this.flag = dataInput.readUTF();}public ProjectBean(String projectCode, String projectName, String projectType, String projectFrom, String flag) {this.projectCode = projectCode;this.projectName = projectName;this.projectType = projectType;this.projectFrom = projectFrom;this.flag = flag;}public ProjectBean() {}@Overridepublic String toString() {return "ProjectBean{" +"projectCode='" + projectCode + '\'' +", projectName='" + projectName + '\'' +", projectType='" + projectType + '\'' +", projectFrom='" + projectFrom + '\'' +", flag=" + flag + '\'' +'}';}public String getProjectCode() {return projectCode;}public void setProjectCode(String projectCode) {this.projectCode = projectCode;}public String getProjectName() {return projectName;}public void setProjectName(String projectName) {this.projectName = projectName;}public String getProjectType() {return projectType;}public void setProjectType(String projectType) {this.projectType = projectType;}public String getProjectFrom() {return projectFrom;}public void setProjectFrom(String projectFrom) {this.projectFrom = projectFrom;}public String getFlag() {return flag;}public void setFlag(String flag) {this.flag = flag;}
}

Reduce Driver

package icu.wzk.demo03;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
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;public class ReducerJoinDriver {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {// String inputPath = args[0];// String outputPath = args[1];// === 測試環境 ===String inputPath = "project_test";String outputPath = "project_test_output";// === ===Configuration configuration = new Configuration();Job job = Job.getInstance(configuration, "ReducerJoinDriver");job.setJarByClass(ReducerJoinDriver.class);job.setMapperClass(ReducerJoinMapper.class);job.setReducerClass(ReducerJoinReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(ProjectBean.class);job.setOutputKeyClass(ProjectBean.class);job.setOutputValueClass(NullWritable.class);FileInputFormat.setInputPaths(job, new Path(inputPath));FileOutputFormat.setOutputPath(job, new Path(outputPath));boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}}

ReduceMapper

package icu.wzk.demo03;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class ReducerJoinMapper extends Mapper<LongWritable, Text, Text, ProjectBean> {String name;ProjectBean projectBean = new ProjectBean();Text k = new Text();@Overrideprotected void setup(Mapper<LongWritable, Text, Text, ProjectBean>.Context context) throws IOException, InterruptedException {// 獲取路徑信息name = context.getInputSplit().toString();}@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, ProjectBean>.Context context) throws IOException, InterruptedException {String line = value.toString();if (name.contains("layout_project")) {// layout_projectString[] fields = line.split("\t");projectBean.setProjectCode(fields[0]);projectBean.setProjectName(fields[1]);projectBean.setProjectType("");projectBean.setProjectFrom("");projectBean.setFlag("layout_project");// projectCode 關聯k.set(fields[0]);} else {// project_infoString[] fields = line.split("\t");projectBean.setProjectCode(fields[0]);projectBean.setProjectName("");projectBean.setProjectType(fields[1]);projectBean.setProjectFrom(fields[2]);projectBean.setFlag("project_info");// projectCode 關聯k.set(fields[0]);}context.write(k, projectBean);}
}

ReduceReducer

package icu.wzk.demo03;import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ReducerJoinReducer extends Reducer<Text, ProjectBean, ProjectBean, NullWritable> {@Overrideprotected void reduce(Text key, Iterable<ProjectBean> values, Reducer<Text, ProjectBean, ProjectBean, NullWritable>.Context context) throws IOException, InterruptedException {List<ProjectBean> dataList = new ArrayList<>();ProjectBean deviceProjectBean = new ProjectBean();for (ProjectBean pb : values) {if ("layout_project".equals(pb.getFlag())) {// layout_projectProjectBean projectProjectBean = new ProjectBean(pb.getProjectCode(),pb.getProjectName(),pb.getProjectType(),pb.getProjectFrom(),pb.getFlag());dataList.add(projectProjectBean);} else {// project_infodeviceProjectBean = new ProjectBean(pb.getProjectCode(),pb.getProjectName(),pb.getProjectType(),pb.getProjectFrom(),pb.getFlag());}}for (ProjectBean pb : dataList) {pb.setProjectType(deviceProjectBean.getProjectType());pb.setProjectFrom(deviceProjectBean.getProjectFrom());context.write(pb, NullWritable.get());}}
}

運行結果

ProjectBean{projectCode='"02d9c090-e467-42b6-9c14-52cacd72a4a8"', projectName='"社區項目2"', projectType='"重要類型"', projectFrom='"種類1"', flag=layout_project'}
ProjectBean{projectCode='"244dcaca-0778-4eec-b3a2-403f8fac1dfb"', projectName='"智慧社區"', projectType='"重要類型"', projectFrom='"種類1"', flag=layout_project'}
ProjectBean{projectCode='"2e556d83-bb56-45b1-8d6e-00510902c464"', projectName='"街道公交站點"', projectType='"普通類型"', projectFrom='"種類2"', flag=layout_project'}
ProjectBean{projectCode='"3ba00542-eac9-4399-9c2b-3b06e671f4c9"', projectName='"未命名項目1"', projectType='"一般類型"', projectFrom='"種類2"', flag=layout_project'}
ProjectBean{projectCode='"5a5982d7-7257-422f-822a-a0c2f31c28d1"', projectName='"未命名項目2"', projectType='"一般類型"', projectFrom='"種類2"', flag=layout_project'}
ProjectBean{projectCode='"8aea9ba2-435c-48bd-9751-1cbd4c344d4e"', projectName='"社區項目1"', projectType='"重要類型"', projectFrom='"種類1"', flag=layout_project'}
ProjectBean{projectCode='"94befb97-d1af-43f2-b5d5-6df9ce5b9393"', projectName='"公交站點"', projectType='"普通類型"', projectFrom='"種類1"', flag=layout_project'}
ProjectBean{projectCode='"f44c8d10-bc92-4398-ad9b-8c11dd48ad7c"', projectName='"街道布建"', projectType='"普通類型"', projectFrom='"種類2"', flag=layout_project'}

在這里插入圖片描述

方案缺點

JOIN 操作是在 reduce 階段完成的,reduce端處理壓力過大map節點的運算負載很低,資源利用不高

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

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

相關文章

文件掃描pdf怎么弄?5個簡易高效的文件掃描方法

在繁忙的工作中&#xff0c;我們常常需要將紙質文件快速轉換為電子文檔&#xff0c;以便于編輯、存儲或分享。 無論是合同、報告還是筆記&#xff0c;將這些紙質文件轉換為Word格式&#xff0c;不僅能提高工作效率&#xff0c;還能確保信息的安全備份。然而&#xff0c;面對市…

前端領域創作者紀念日:回顧與展望

引言 在2048天前&#xff0c;我加入了CSDN。本文將帶您回顧前端技術的發展歷程&#xff0c;探索前端創作者的貢獻&#xff0c;并展望未來的發展方向。 前端技術的發展歷程 前端技術的發展可以追溯到互聯網的早期時代。最初的網頁主要是靜態的HTML文檔&#xff0c;內容簡單&…

57、Flink 的項目配置概述

1&#xff09;概覽 1.開始 要開始使用 Flink 應用程序&#xff0c;請使用以下命令、腳本和模板來創建 Flink 項目。 可以使用如下的 Maven 命令或快速啟動腳本&#xff0c;基于原型創建一個項目。 a&#xff09;Maven 命令 mvn archetype:generate \-Darch…

開源大模型的中流砥柱——LLaMA

元宇宙平臺公司在近年來大力發展人工智能技術,尤其在大規模語言模型(LLM)領域取得了顯著進展。其代表性作品LLaMA(Large Language Model)及其后續版本LLaMA 2和LLaMA 3,成為了業界關注的焦點。 LLaMA模型的發布與許可 LLaMA模型的發布標志著在自然語言處理(NLP)領域的…

使用 Spring Security 配置 HTTPS

引言 為了保護敏感數據免受網絡攻擊&#xff0c;在 Web 應用中使用 HTTPS 是必不可少的。HTTPS 提供了數據傳輸的加密&#xff0c;確保數據在客戶端和服務器之間傳輸時的安全性。Spring Security 提供了簡單的配置方式來實現 HTTPS。本文將詳細介紹如何在 Spring Boot 項目中配…

wordpress建站用付費模板還是免費模板

在WordPress建站時&#xff0c;選擇模板是一個重要的決策。我們可以看到免費和付費模板各有優缺點。 免費模板的主要優點是成本效益。對于預算有限的個人或小企業來說&#xff0c;免費模板是一個理想的選擇&#xff0c;因為它們不需要任何費用。此外&#xff0c;免費模板通常與…

Redis 7.x 系列【16】持久化機制之 AOF

有道無術&#xff0c;術尚可求&#xff0c;有術無道&#xff0c;止于術。 本系列Redis 版本 7.2.5 源碼地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 概述2. 執行原理2.1 Redis 6.x2.1.1 直接寫2.1.2 重寫 2.2 Redis 7.x2.2.1 Redis 6…

Spring Ioc學習

第二章 Spring IOC 章節內容 Spring IOC技術實現Spring IOC設值注入Spring IOC構造注入 章節目標 掌握Spring IOC技術實現掌握Spring IOC設置注入掌握Spring IOC構造注入 第一節 Spring簡介 1. Spring 簡介 Spring 是目前主流的 Java 開發框架&#xff0c;是 Java 世界最…

基于Springboot+Vue+mysql倉庫管理系統倉庫進銷存管理系統

博主介紹&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C編程語言&#xff0c;同時也熟練掌握微信小程序、Php和Android等技術&#xff0c;能夠為大家提供全方位的技術支持和交流。 我有豐富的成品Java、Python、C#畢設項目經驗&#xff0c;能夠為學生提供各類…

Vue 父子頁面使用指南

Vue3父子頁面使用指南 Vue3作為一種現代化的前端框架&#xff0c;提供了強大的組件化功能&#xff0c;使得頁面開發更加模塊化和可維護。本文將深入探討Vue3中父子頁面的使用方法&#xff0c;包括如何傳遞參數、父組件如何調用子組件的方法&#xff0c;以及父子頁面的加載原理…

為什么面向對象的設計方法逐漸減少

在軟件開發領域&#xff0c;面向對象設計&#xff08;Object-Oriented Design, OOD&#xff09;曾經是主導的編程范式。它的主要特征是通過類和對象來組織代碼&#xff0c;并利用繼承、封裝和多態性等特性來實現代碼復用和模塊化。然而&#xff0c;近年來&#xff0c;隨著前端開…

【Python】Python中的數據類型

數據類型 導讀一、數據類型的分類1.1 Number&#xff08;數字&#xff09;1.1.1 靜態數據類型1.1.2 動態數據類型 1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布爾類型&#xff09; 二、數據類型的轉換2.1 隱式類型轉換2.2 顯式類型轉換2.2.1 int(x[,base])…

系統運維面試總結(shell編程)

SYNDDOS攻擊&#xff0c;需要判斷這個訪問是正常訪問還是信包攻擊&#xff0c;當前這個信包發起的訪問數量是多少&#xff0c;例如看到30個信包同時再訪問時設置監控報警。 一般選用/dev/urandom生成&#xff0c;但其生成的隨機數帶有二進制亂碼&#xff0c;所以需要tr命令…

光源基礎知識及選型原則

光的基礎知識 1.光譜(專業理解):光能量在不同頻率上的分布。 2.可見光的波段在380mm—700mm之間。紅光波長最長,為700mm左右,紫光波長最短,在380mm左右。 3.色溫(以白色為界):光源的顏色與黑體在某一溫度下輻射光的顏色相同(或最相近)時,黑體的溫度就稱為該光源…

CASS中按指定距離和方向移動圖形

1、繪制一個圖形 打開軟件&#xff0c;隨意繪制一個矩形&#xff0c;并量取左下角點的坐標值&#xff0c;具體如下&#xff1a; 2、按距離移動原理講解 例1&#xff1a;將圖形沿著y軸負方向移動100米&#xff0c;如何實現&#xff1f; 如上圖所示&#xff0c;測繪中的坐標系…

多載波調制與OFDM原理講解以及MATLAB實現GUI設計

前言 基于MATLAB設計并實現了一個OFDM調制的圖形用戶界面&#xff08;GUI&#xff09;系統。該系統旨在簡化OFDM調制過程的仿真&#xff0c;提供友好的用戶交互界面。設計目標是通過GUI實現參數化的OFDM仿真&#xff0c;包括子載波數、符號數、IFFT長度、循環前綴長度、循環后…

模擬退火算法2—優缺點

模擬退火算法優點 1、以一定的概率接受惡化解 模擬退火算法(SA)在搜索策略上與傳統的隨機搜索方法不同,它不僅引入了適當的隨機因素,而且還引入了物理系統退火過程的自然機理。這種自然機理的引入使模擬退火算法在迭代過程中不僅接受使目標函數變“好”的試探點,而且還能以一…

【單片機畢業設計選題24034】-基于STM32的手機智能充電系統

系統功能: 系統可以設置充電時長&#xff0c;啟動充電后按設置的充電時長充電&#xff0c;充電時間到后自動 停止充電&#xff0c;中途檢測到溫度過高也會結束充電并開啟風扇和蜂鳴器報警。 系統上電后&#xff0c;OLED顯示“歡迎使用智能充電系統請稍后”&#xff0c;兩秒鐘…

Python錯誤處理 -- 異常捕獲

本套課在線學習視頻&#xff08;網盤地址&#xff0c;保存到網盤即可免費觀看&#xff09;&#xff1a; ??https://pan.quark.cn/s/ebe046289eb0?? 本文詳細介紹了Python編程中try-except-else-finally語句的用法&#xff0c;重點講解了如何通過這些語句對程序中可能出現…

哨兵1SAR空間數據包協議數據單元文檔(五)

《哨兵1SAR空間數據包協議數據單元》文檔對數據包的結構進行了詳細描述&#xff0c;并提供了用戶數據的格式和解碼算法。 原文鏈接: 哨兵1SAR空間數據包協議數據單元文檔英文版 同系列中的其他文章篇鏈接: 哨兵1SAR空間數據包協議數據單元文檔&#xff08;一&#xff09; 哨兵1…