MapReduceの実装は、アルゴリズムに参加します

要件:注文と商品テーブルは、マージショーに参加します

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 );

    }
}

 

公開された33元の記事 ウォンの賞賛3 ビュー5870

おすすめ

転載: blog.csdn.net/WandaZw/article/details/82744948