2017-09-20 3 views
0

を減らして2つのファイルの内容を参加:

最初のファイル(従業員名のデータを含む)

id,name 
101,Gaurav 
102,Rohit 
103,Karishma 
104,Darshan 
105,Divya 

セカンドファイルを(従業員部門のデータを含む)

id,dept 
101,Sales 
102,Research 
103,NMG 
104,Admin 
105,HR 

=====================

私は、出力のこの種をacheiveするにはどうすればよいです

出力

id,name,dept 
101,Gaurav,Sales 
102,Rohit,Research 
103,Karishma,NMG 

?今私は、減速中にランダムな値などのアウトを取得していますのよう

..

私は、ID、名前、部署などの指定された順序で出力したいです。 助けていただければ幸いです。

マッパークラスは次のようになります...

public class JoinMapper extends Mapper<LongWritable, Text, Text, Text> { 
private Text keyEmit = new Text(); 
private Text valEmit = new Text(); 
public void map(LongWritable k, Text value, Context context) throws IOException, InterruptedException 
{ 
String line=value.toString(); 
String[] words=line.split(","); 
keyEmit.set(words[0]); 
valEmit.set(words[1]); 
context.write(keyEmit, valEmit); 
} 
} 

リデューサークラスは次のようになります...

public class JoinReducer extends Reducer<Text, Text, NullWritable, Text> { 
String merge = ""; 
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 
    merge = key.toString(); // 101 
    for(Text value : values) { 
     merge += "," + value.toString(); 
    } 
    context.write(NullWritable.get(), new Text(merge)); 
} 
} 

ドライバーのクラス次のようになります...

public class JoinDriver { 
public final static void main(final String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    Job job = new Job(conf, "Multiple join"); 

    job.setJarByClass(JoinDriver.class); 
    // job.setMapperClass(JoinMapper.class); 
    job.setReducerClass(JoinReducer.class); 

    MultipleInputs.addInputPath(job, new Path(args[0]), 
      TextInputFormat.class, JoinMapper.class); 

    MultipleInputs.addInputPath(job, new Path(args[1]), 
      TextInputFormat.class, JoinMapper.class); 

    job.setMapOutputKeyClass(Text.class); 
    job.setMapOutputValueClass(Text.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(Text.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 
    FileOutputFormat.setOutputPath(job, new Path(args[2])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
} 
} 

出力は次のようになります。私はid、name、departmentの順番でそれを望みます。

output as of now

+0

質問にはコードを入力する必要があります。 –

+0

@BinaryNerdコードをチェックしてください。私が知っておくべきことは、減速機への入力として送信される値がランダムであること、この特定の場合に特定の順序で送信する方法です。 –

答えて

0

あなたが持っている主な問題は、値がソートされていないこと、したがって、あなたは、共通鍵にグループ化しているが、あなたがしている知らないので、単なる文字列として値を送信すると、大規模な便利ではありません名前と部門です。

あなたはマッパーからより多くの情報を送信する必要がすべてが、いくつかのオプション、持っている:減速中の値

最も簡単な方法の二種の

  • ソートを使用し

    1. をこれを行うには、マッパーで出力するときに値にいくつかの情報を追加します(2つのTextオブジェクトを含むコンポジット値を使用するのが理想です)。

      public class JoinMapperName extends Mapper<LongWritable, Text, Text, Text> { 
          public void map(LongWritable k, Text value, Context context) 
                throws IOException, InterruptedException { 
      
           String[] words = value.toString().split(","); 
           context.write(new Text(words[0]), new Text("name:" + words[1])); 
          } 
      } 
      
      public class JoinMapperDept extends Mapper<LongWritable, Text, Text, Text> { 
          public void map(LongWritable k, Text value, Context context) 
                throws IOException, InterruptedException { 
      
           String[] words = value.toString().split(","); 
           context.write(new Text(words[0]), new Text("dept:" + words[1])); 
          } 
      } 
      

      これで、各データソースごとに異なるマッパーが設定されました。そして、減速機を次のように変更する必要があります。

      public class JoinReducer extends Reducer<Text, Text, NullWritable, Text> { 
          public void reduce(Text key, Iterable<Text> values, Context context) 
             throws IOException, InterruptedException { 
      
           String name = ""; 
           String dept = ""; 
           for(Text value : values) { 
            if (value.toString().startsWith("name")) { 
             name = value.toString().split(":")[1]; 
            } else { 
             dept = value.toString().split(":")[1]; 
            } 
           } 
           String merge = key + "," name + "," + dept; 
           context.write(NullWritable.get(), new Text(merge)); 
          } 
      } 
      

      これは簡単な例です。うまくいけば、あなたが注文を実施する方法についてのいくつかのアイデアをあなたに提供します。

  • +0

    ありがとう!それは私の問題を解決しました。 –