要件:注文と商品テーブルは、マージショーに参加します
orders.txt注文データ
Order_0000001、pd001,222.8
Order_0000001、pd005,25.8
Order_0000002、pd005,325.8
Order_0000002、pd003,522.8
Order_0000002、pd004,122.4
Order_0000003、pd001,222.8
Order_0000003、pd001,322.8
products.txt製品データ
PD001、アップルの
pd002、バナナ
Pd003、オレンジ
pd004、小米科技の
pd005、MEIZU
アイデア:実装は二つの形式で実施することができる参加
1:最終マージデータを削減
財の異なる次数の依存性、タスクを減らして実施しますが、実際に大規模なデータに偏りが生じることが原因の問題を商品を販売するデータの量ここで
2:マッパーの終わりには、合併しました
私たちは、MapReduceの分散キャッシュ技術を使用する必要があり、キャッシュ団結呼び出しの少ないデータ、製品データ
ここでは、エンド・マッパー組み合わせたコードの実装を記述方法を説明します
package com.mapreduce.joinCacheFile;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
/**
* mapreduce join 算法
*/
public class MapJoinDistributedCacheFile {
public static class MapJoinMapper extends Mapper<LongWritable,Text,Text,NullWritable>{
FileReader in =null;
BufferedReader reader = null;
HashMap<String,String[]> b_tab = new HashMap<String,String[]>();
@Override
protected void setup(Context context) throws IOException, InterruptedException {
//此处加载产品表数据
in = new FileReader("pdts.txt");
reader = new BufferedReader( in );
String line = null;
while(StringUtils.isNotBlank((line= reader.readLine()))){
String [] split = line.split(",");
String [] products = { split[0],split[1] };
b_tab.put( split[0],products );
}
IOUtils.closeStream( reader );
IOUtils.closeStream( in );
}
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] orderFields = line.split( "\t" );
String pdt_id = orderFields[1];
String[] pdtFields = b_tab.get(pdt_id);
String ll = pdtFields[0]+"\t"+pdtFields[1]+"\t"+orderFields[1]+"\t"+orderFields[2];
context.write( new Text( ll ),NullWritable.get() );
}
}
public static void main(String[] args) throws Exception {
Configuration con = new Configuration();
Job job = Job.getInstance(con);
job.setJarByClass( MapJoinDistributedCacheFile.class );
job.setMapperClass( MapJoinMapper.class );
job.setOutputKeyClass( Text.class );
job.setOutputValueClass( NullWritable.class );
FileInputFormat.setInputPaths( job,new Path("d://bigDataJob/mapJoin/orders") );
FileOutputFormat.setOutputPath( job,new Path("d://bigDataJob/mapJoin/output" ));
//不需要汇总
job.setNumReduceTasks(0);
job.addCacheFile( new URI( "file:/D:/pdts.txt" ));
job.waitForCompletion( true );
}
}