大資料學習之十——MapReduce代碼執行個體:資料去重和資料排序

來源:互聯網
上載者:User

標籤:輸出類型   map   trim   直接   reduce   write   複製   iterable   轉換   

***資料去重***

目標:未經處理資料中出現次數超過一次的資料在輸出檔案中只出現一次。

演算法思想:根據reduce的過程特性,會自動根據key來計算輸入的value集合,把資料作為key輸出給reduce,無論這個資料出現多少次,reduce最終結果中key只能輸出一次。

1.執行個體中每個資料代表輸入檔案中的一行內容,map階段採用Hadoop預設的作業輸入方式。將value設定為key,並直接輸出。 map輸出資料的key為資料,將value設定成空值
2.在MapReduce流程中,map的輸出<key,value>經過shuffle過程聚整合<key,value-list>後會交給reduce
3.reduce階段不管每個key有多少個value,它直接將輸入的key複製為輸出的key,並輸出(輸出中的value被設定成空)。

代碼實現:

public class testquchong {     

static String INPUT_PATH="hdfs://master:9000/quchong";    //將檔案file1和file2放在該目錄下

static String OUTPUT_PATH="hdfs://master:9000/quchong/qc";    

static class MyMapper extends Mapper<Object,Text,Text,Text>{    //將輸入輸出作為string類型,對應Text類型

private static Text line=new Text();    //每一行作為一個資料 

protected void map(Object key, Text value, Context context) throws IOException, InterruptedException{   

 line=value;    

context.write(line,new Text(","));     //key是唯一的,作為資料,即實現去重

 }

 }  

 static class MyReduce extends Reducer<Text,Text,Text,Text>{   

protected void reduce(Text key,Iterable<Text> values,Context context) throws IOException,InterruptedException{      

 context.write(key,new Text(" "));   //map傳給reduce的資料已經做完資料去重,輸出即可

 }   

}    

public static void main(String[] args) throws Exception{   

Path outputpath=new Path(OUTPUT_PATH);   

Configuration conf=new Configuration();   

Job job=Job.getInstance(conf);     

 job.setMapperClass(MyMapper.class);  

 job.setReducerClass(MyReduce.class);       

 job.setOutputKeyClass(Text.class);  

 job.setOutputValueClass(Text.class);     

 FileInputFormat.setInputPaths(job, INPUT_PATH);  

 FileOutputFormat.setOutputPath(job,outputpath);   

job.waitForCompletion(true);

 }

}

 

***資料排序***

目標:實現多個檔案中的資料進行從小到大的排序並輸出

演算法思想:MapReduce過程中就有排序,它的預設定序按照key值進行排序的,如果key為封裝int的IntWritable類型,那麼MapReduce按照數字大小對key排序,如果key為封裝為String的Text類型,那麼MapReduce按照字典順序對字串排序。
使用封裝int的IntWritable型資料結構。也就是在map中將讀入的資料轉化成IntWritable型,然後作為key值輸出(value任意)。reduce拿到<key,value-list>之後,將輸入的key作為value輸出,並根據value-list中元素的個數決定輸出的次數。輸出的key(即代碼中的linenum)是一個全域變數,它統計當前key的位次。

代碼實現:

public class paixu {      

static String INPUT_PATH="hdfs://master:9000/test";  

static String OUTPUT_PATH="hdfs://master:9000/output/sort";    

static class MyMapper extends Mapper<Object,Object,IntWritable,NullWritable>{    //選擇為Int類型,value值任意

IntWritable output_key=new IntWritable();   

NullWritable output_value=NullWritable.get();   

protected void map(Object key, Object value, Context context) throws IOException, InterruptedException{        

int val=Integer.parseUnsignedInt(value.toString().trim());     //進行資料類型轉換

output_key.set(val);   

 context.write(output_key,output_value);   //key值確定

 }  

}    

static class MyReduce extends Reducer<IntWritable,NullWritable,IntWritable,IntWritable>{    //輸入是map的輸出,輸出行號和資料為int

IntWritable output_key=new IntWritable();    

int num=1;      

protected void reduce(IntWritable key,Iterable<NullWritable> values,Context context) throws IOException,InterruptedException{   

output_key.set(num++);   //迴圈賦值作為行號

 context.write(output_key,key);    //key為map傳入的資料

 }    

public static void main(String[] args) throws Exception{   

Path outputpath=new Path(OUTPUT_PATH);   

Configuration conf=new Configuration();         

Job job=Job.getInstance(conf);   

FileInputFormat.setInputPaths(job, INPUT_PATH);   

FileOutputFormat.setOutputPath(job,outputpath);     

 job.setMapperClass(MyMapper.class);  

 job.setReducerClass(MyReduce.class);     

 job.setMapOutputKeyClass(IntWritable.class);    //因為map和reduce的輸出類型不一樣

 job.setMapOutputValueClass(NullWritable.class);      

job.setOutputKeyClass(IntWritable.class);   

job.setOutputValueClass(IntWritable.class);     

 job.waitForCompletion(true);  

}

}

 

大資料學習之十——MapReduce代碼執行個體:資料去重和資料排序

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.