Hadoop學習總結(MapReduce的數據去重)

? ? ? 現在假設有兩個數據文件

file1.txtfile2.txt
2018-3-1 a
2018-3-2 b
2018-3-3 c
2018-3-4 d
2018-3-5 a
2018-3-6 b
2018-3-7 c
2018-3-3 c
2018-3-1 b
2018-3-2 a
2018-3-3 b
2018-3-4 d
2018-3-5 a
2018-3-6 c
2018-3-7 d
2018-3-3 c

? ? ? 上述文件 file1.txt 本身包含重復數據,并且與 file2.txt 同樣出現重復數據,現要求使用 Hadoop 大數據相關技術對這兩個文件進行去重操作,并最終將結果匯總到一個文件中。

一、MapReduce 的數據去重

二、案例實現

1、Map 階段實現

DedupMapper.java

package com.itcast.dedup;//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class DedupMapper extends Mapper<LongWritable, Text,Text, NullWritable> {//重寫Ctrl+o@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//        <0,2018-3-1 a> <11,2018-3-2 b>
//        NullWritable.get() 方法設置空值context.write(value, NullWritable.get());}
}

? ? ? 該代碼的作用是為了讀取數據集文件將 TextInputFormat 默認組件解析的類似 <0,2018-3-1 a> 鍵值對修改??<2018-3-1 a,null>

2、Reduce 階段實現

DedupReducer.java

package com.itcast.dedup;//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class DedupReducer extends Reducer<Text, NullWritable,Text,NullWritable> {@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {//<2018-3-1 a,null> <11,2018-3-2 b,null> <11,2018-3-3 c,null>context.write(key,NullWritable.get());}
}

? ? ? 該代碼的作用僅僅是接受 Map 階段傳遞來的數據,根據 Shuffle 工作原理,鍵值 key 相同的數據就不會被合并,因此輸出數據就不會出現重復數據了。

3、Dtuver 程序主類實現

DedupDriver.java

package com.itcast.dedup;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
//import org.apache.hadoop.io.IntWritable;
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 DedupDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//通過 Job 來封裝本次 MR 的相關信息Configuration conf = new Configuration();//System.setProperty("HADOOP_USER_NAME","root");//配置 MR 運行模式,使用 local 表示本地模式,可以省略
//        conf.set("mapreduce.framework.name","local");Job job = Job.getInstance(conf);//指定 MR Job jar 包運行主類job.setJarByClass(DedupDriver.class);//指定本次 MR 所有的 Mapper Reducer 類job.setMapperClass(DedupMapper.class);job.setReducerClass(DedupReducer.class);//設置業務邏輯 Mapper 類的輸出 key 和 value 的數據類型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(NullWritable.class);//設置業務邏輯 Reducer 類的輸出 key 和 value 的數據類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(NullWritable.class);//使用本地模式指定處理的數據所在的位置//{input2\*} 表示讀取該路徑下所有的文件FileInputFormat.setInputPaths(job,"D:\\homework2\\Hadoop\\mr\\{input2\\*}");//使用本地模式指定處理完成之后的結果所保存的位置FileOutputFormat.setOutputPath(job, new Path("D:\\homework2\\Hadoop\\mr\\output"));//提交程序并且監控打印程序執行情況boolean res = job.waitForCompletion(true);//執行成功輸出 0 ,不成功輸出 1System.exit(res ? 0 : 1);}
}

運行結果:

?三、拓展

? ? ? ? 只要日期相同,就判定為相同,最后結果輸出日期即可

只需要修改DedupMapper.java文件

package com.itcast.dedup;//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class DedupMapper extends Mapper<LongWritable, Text,Text, NullWritable> {//重寫Ctrl+o@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//輸出日期// 把 hadoop 類型轉換為 java 類型(接收傳入進來的一行文本,把數據類型轉換為 String 類型)String line = value.toString();// 把字符串拆分為單詞String[] words = line.split(" ");// 輸出前面的內容String wo = words[0];context.write(new Text(wo), NullWritable.get());}
}

運行結果:

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

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

相關文章

匯編-PROTO聲明過程

64位匯編 64 模式中&#xff0c;PROTO 偽指令指定程序的外部過程&#xff0c;示例如下&#xff1a; ExitProcess PROTO ;指定外部過程&#xff0c;不需要參數.code main PROCmov ebx, 0FFFFFFFFh mov ecx,0 ;結束程序call ExitProcess ;調用外部過程main ENDP END 32位…

手把手云開發小程序-(四)-uniclould增刪改查業務開發

一&#xff0c;導入uView 在開發小程序的時候&#xff0c;我習慣使用uView這個ui庫。主要是直接用當然比自己寫省時間。 它的官網&#xff1a;uView - 多平臺快速開發的UI框架 - uni-app UI框架 (gitee.io) 導入&#xff1a; npm install uview-ui2.0.31然后按照官網進行配…

UltraCompare 23 for Mac文件對比工具

UltraCompare是一款功能強大的文件比較和合并工具&#xff0c; 以下是它的特色介紹&#xff1a; 多種文件格式支持&#xff1a;UltraCompare支持比較和合并多種文件格式&#xff0c;包括文本文件、二進制文件、office文檔、PDF文件等。 文件差異高亮顯示&#xff1a;UltraComp…

內測分發平臺的合作生態和生態效應如何

大家好&#xff0c;我是咕嚕-凱撒&#xff0c;隨著移動互聯網和智能設備的快速發展&#xff0c;越來越多的開發者和企業開始關注產品的質量和體驗。而內測分發平臺則成為了一種重要的工具&#xff0c;能夠幫助他們更好地測試、優化和推廣產品。在此過程中&#xff0c;內測分發平…

特殊企業信息輕松查詢:特殊企業基本信息查詢API的實用性探討

引言 在當今數字化時代&#xff0c;企業管理和決策往往取決于有效獲取和分析關鍵信息。對于特殊企業&#xff0c;如香港公司、社會組織、律所、事業單位、基金會和新機構&#xff0c;獲取準確、及時的基本信息至關重要。在這個背景下&#xff0c;特殊企業基本信息查詢API正逐漸…

〔004〕虛幻 UE5 像素流部署

? 目錄 ? 啟用像素流插件? 打包項目? 下載環境包? 手動下載? 安裝信令服務器環境? 啟動信令服務器? 設置啟動參數? 啟動程序? 網頁運行? 開啟觸控界面? 啟用像素流插件 打開虛幻啟動程序,選擇 編輯 后點擊 插件在插件列表中搜索 pixel streaming 關鍵字,勾選后重…

springcloud宿舍管理系統源碼

開發技術&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介紹&#xff1a; 用戶端&#xff1a; 登錄注冊 首頁展示輪播&#xff0c;公告&#xff0c;報修&#xff0c;晚歸登記&#xff0…

提升抖音小店服務分:優化策略與實操指南

抖音小店服務分是抖音平臺為評估和提升小店服務質量而設立的一項指標。它通過對小店在訂單管理、售后服務、物流管理等多個方面的表現進行評估和計算&#xff0c;為小店提供一個可衡量的服務質量指標。提高抖音小店服務分數對于增加用戶信任度、提升銷售額和增加曝光度都非常重…

第十七章 Java鏈接數據庫

目錄 1.登錄MySQL 2.創建庫和表 3.使用Java命令查詢數據庫操作 4.右擊——點擊“Build Path”——選擇第四個——找到包的位置——導入成功 一、創建java項目 1.注冊驅動 2.獲取鏈接 3.獲取statment對象 4.執行sql語句返回結果集 5.遍歷結果集 6.關閉連接釋放資源 封裝…

opencv-python比較圖像差異性方法

OpenCV-Python提供了幾種比較兩幅圖像差異的函數&#xff0c;主要有以下幾種&#xff1a; 1.cv2.absdiff()&#xff1a;計算兩幅圖像的差異&#xff0c;并返回差異圖像。使用該函數時&#xff0c;需要先將兩幅圖像轉換為相同的大小和類型。 diff cv2.absdiff(image1, image2…

Linux:設置Ubuntu的root用戶密碼

執行以下命令&#xff1a; 給root用戶設置密碼 sudo passwd 輸入兩次密碼 切換root su root 退出root用戶 exit

windows根據已有的安卓簽名文件獲取MD5簽名

windows根據已有的安卓簽名文件獲取MD5簽名 0 現狀 uniapp 本機號碼一鍵登錄需要MD5的&#xff0c;現有的簽名文件但是只有SHA1和SHA256 查看SHA1和SHA256 keytool -list -v -keystore [你的.keystore文件]1 前提 已有生成簽名文件的環境 搭建Openssl環境&#xff0c;設置…

0基礎能不能轉行做網絡安全?網絡安全人才發展路線

最近有同學在后臺留言&#xff0c;0基礎怎么學網絡安全&#xff1f;0基礎可以轉行做網絡安全嗎&#xff1f;以前也碰到過類似的問題&#xff0c;想了想&#xff0c;今天簡單寫一下。 我的回答是先了解&#xff0c;再入行。 具體怎么做呢&#xff1f; 首先&#xff0c;你要確…

idea 2023 安裝配置 Gradle8.4

官網&#xff1a;https://gradle.org 下載 Gradle8.4 https://gradle.org/releases/ 解壓到本地&#xff0c;到 gradle-8.4\init.d 目錄下新建文件&#xff1a;init.gradle 這里有個坑&#xff0c;編譯報http協議安全的問題&#xff0c;解決辦法&#xff0c;加入&#xff1…

Android7.1 高通平臺 修改系統默認語言

客戶需求&#xff1a;修改系統默認語言為英文&#xff08;美國&#xff09; 源碼位置&#xff1a;/build/tools/buildinfo.sh 只需修改 ro.product.locale的值即可&#xff0c;如下圖&#xff1a;

【Java】定時器的簡單應用

在寫代碼的過程中&#xff0c;如果我們遇到了隔一段時間就要進行一項任務時&#xff0c;采用定時器會提高我們的效率。下面對定時器的使用進行簡單說明 1、應用說明 首先我們要創建一個Timer類 Timer timer new Timer(); 然后在timer中調用schedule()方法添加任務 timer.…

redis運維(十三) hash哈希

一 哈希 ① 定義 hash&#xff1a; 散列說明&#xff1a;key對應是值是鍵值對[python中的字典],其中鍵在redis中叫field.形如&#xff1a;value[{field1,value1},...{fieldN,valueN}],值本身又是一種鍵值對結構 ② 優點和缺點 wzj_height 180wzj_age 18等價 -->…

Confluence Server Webwork 預身份驗證 OGNL 注入 (CVE-2021-26084)

漏洞描述 Confluence 是由澳大利亞軟件公司 Atlassian 開發的基于 Web 的企業 wiki。 存在一個 OGNL 注入漏洞&#xff0c;允許未經身份驗證的攻擊者在 Confluence Server 或 Data Center 實例上執行任意代碼。 漏洞環境及利用 搭建docker環境 Confluence搭建見前文 Atlas…

高效聚合 | AIRIOT智慧虛擬電廠管理解決方案

傳統的電力供應模式主要依靠大型發電廠和電網進行能源傳輸和分配&#xff0c;但這種模式會導致能源浪費、環境污染等問題&#xff0c;往往存在如下的運維問題和管理痛點&#xff1a; 資源整合能力差&#xff1a;傳統電力供應模式無法集成和整合分散的電力資源&#xff0c;包括…

深度學習動物識別 - 卷積神經網絡 機器視覺 圖像識別 計算機競賽

文章目錄 0 前言1 背景2 算法原理2.1 動物識別方法概況2.2 常用的網絡模型2.2.1 B-CNN2.2.2 SSD 3 SSD動物目標檢測流程4 實現效果5 部分相關代碼5.1 數據預處理5.2 構建卷積神經網絡5.3 tensorflow計算圖可視化5.4 網絡模型訓練5.5 對貓狗圖像進行2分類 6 最后 0 前言 &#…