1. 程式人生 > 其它 >java實現wordCount的map

java實現wordCount的map

開啟IDEA,File——new ——Project,新建一個專案

 

 我們已經安裝好了maven,不用白不用

 

 這裡不要選用骨架,Next。在寫上Groupid,Next。

 

寫上專案名稱,finish。ok。

 

 

 一個專案就建好了,他長這樣:

 

 新建的專案要配置一下maven。畢竟我們馬上就要用它。然後匯入依賴

開啟pom.xml

 

 不願意一個一個敲的話,可以使用cv大法。

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

等待下載的時候我們可以建立專案了。開啟src——main——java,右鍵Package,我們在這裡新建一個package。我們在這裡包裡面寫一個wordcoutn的案例。

 

 名字就叫MR

.

 

mr下再建一個包:wc。如圖:

 

 在wc下新建一個java類:wcMapper。這個類負責讀取單詞,生成map(鍵值對)

再建立一個wcReduce類。這個類負責聚合,把key相同的資料放到一起,並且累加value。

再建立一個wcDriver類,驅動類主要用於關聯Mapper 和 Reducer 以及 提交整個程式。就像這樣:

 

 在寫程式碼之前,我們先看一個mapreduce程式設計規範:

 

 繼續看程式碼,我們先寫wcMapper類

package MR.wc;

/**
* 按行讀取資料,拆成一個一個的單詞
* */
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**繼承Mapper類,這個類要是hadoop.mapreduce.Mapper
* 這裡有一個泛型, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>KEYIN,VALUEIN 規定資料是以什麼型別進入map程式(MR程式提供了幾種型別)
* KEYIN這個引數表示讀取檔案的行數,一般是數字型別。由於是檔案可能會很大,一般不用int,而是用long
* VALUEIN這個引數表示讀取資料的格式,也就是單詞的格式,這裡就是字串
* 我們的物件要在節點之間通過網路傳輸,就需要序列化。但是java的序列化是一個重量級序列化框架,一個物件被序列化後,會附帶很多額外的資訊
* (各種校驗資訊,header,繼承體系等),不便於在網路中高效傳輸。所以hadoop開發了一套序列化機制(writable),精簡,高效
*
*
*/
public class wcMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
Text ko=new Text();
IntWritable vo=new IntWritable(1);//value值預設為1
//重寫map方法,key跟value是我們讀取進來的資料,資料處理玩以後就放到congtext(上下文)裡面
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
//讀取到的這一行資料先轉成String型別
String line = value.toString();
//按照空格切分單詞
String[] words = line.split(" ");
//處理資料
for (String word : words) {
//keyout設定成單詞
ko.set(word);
//通過上下把處理好的資料寫出
context.write(ko,vo);
}
}}

到這裡,map這個過程就寫完了,這個過程就實現了按行讀取資料,並且把單詞轉化成了key,value的形式,給每個單詞的value值標成了1,然後通過上下文把資料寫出,在wc這個程式中,實際上就是把這個key,value傳給了wcRecude。讓reduce過程去按照key聚合value。

常用java型別對應的HadoopWritable型別: