書名: Hadoop大數據技術開發實戰作者名: 張偉洋本章字數: 659字更新時間: 2020-03-06 11:48:42
5.4 案例分析:數據去重
在大量數據中,難免存在重復數據,本例使用MapReduce對數據進行去重處理,使相同的數據在最終的輸出結果中只保留一份。統計數據的種類個數、網站訪問的IP數量等都會涉及數據去重。
已知有兩個文件file1.txt和file2.txt,需要對這兩個文件中的數據進行合并去重,文件中的每行是一個整體。
file1.txt的內容如下:

file2.txt的內容如下:

期望的輸出結果如下:

1. 設計思路
根據MapReduce的工作原理可知,MapReduce的Shuffle階段會將Map任務的結果數據進行分區,并按照key進行分組,同一組的數據將輸入到同一個Reduce任務中進行處理。而根據key分組的過程,實際上就是去重的過程。因此,將輸入的每一行數據作為key即可達到數據去重的目的。
2. 編寫程序
在Eclipse中新建一個Maven項目,在項目的pom.xml文件中加入Hadoop的依賴庫,內容如下:

然后在Maven項目中新建數據去重類Dedup.java,完整代碼如下:

3. 程序解讀
上述程序中,map()方法將接收到的<key,value>對中的value直接作為了方法輸出的key,而方法輸出的value則被置為了空字符串;reduce()方法將接收到的<key,value>對中的key直接作為了方法輸出的key,而輸出的value則置為了空字符串。
4. 程序運行
該程序需要在Hadoop集群環境下運行,步驟如下:
在Eclipse中將完成的MapReduce項目導出為jar包,命名為Dedup.jar,然后上傳到Hadoop服務器的相應位置。
在HDFS根目錄下創建input文件夾,命令如下:

將準備好的示例文件file1.txt和file2.txt上傳到HDFS中的/input目錄,命令如下:

執行以下命令,運行寫好的MapReduce數據去重程序:

上述命令中的com.hadoop.mr為程序所在的包名,Dedup為程序類名。
程序運行完畢后,會在HDFS的根目錄下生成output目錄,并在output目錄中生成part-r-00000文件,程序執行結果即存放于該文件中。可以執行以下命令,查看程序執行結果:

如果能正確顯示預期結果,則表明程序編寫無誤。