2017-04-15 16 views
1

目標のMapReduce - 入力から複数の出力と、アレイ

私はpictureによって記載されているように一つの入力ファイルと1つのアレイからの複数の出力ファイルを持っていると思います。私は親クラスProgramのための「check」と呼ばれる静的な属性を持っていることについて考えた

私の考え

。キーがチェックに等しい場合

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

    // Array of checkpoints 
     String[] arr = {"a", "c", "f"}; 

    // Loop for assigning check 
     for(int j = 0; j<arr.length ; j++){ 
      check = arr[j]; 

     // job configuration 
      Configuration conf = new Configuration(); 
      String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
      Job job = new Job(conf, "Program"); 
      //... 
      for (int i = 0; i < otherArgs.length - 1; ++i){ 
        FileInputFormat.addInputPath(job, new Path(otherArgs[i])); 
      } 

     /* here I define multiple outputs */ 
      FileOutputFormat.setOutputPath(job,new Path(otherArgs[otherArgs.length - 1]+j)); 
      job.waitForCompletion(true); 
      if (j == arr.length -1){ 
      System.exit(job.waitForCompletion(true) ? 0 : 1); 
     } 

reducerをチェックする:main方法において

public class Program 
{ 
    //Attribute check 
    private static String check = null; 

    public static class ProgramMapper extends Reducer<Object, Text, Text, Text>{ 
    // mapping 
    } 
    public static class ProgramReducer extends Reducer<Object, Text, Text, TextArray>{ 
    // reducing 
    } 

    public static void main(String[] args){ 
    // main program 
    } 
// ... 

、Iはループの "A"、 "B"、 "C" をするcheckを割り当てることになります

public static class ProgramReducer extends Reducer<Object, Text, Text, TextArray>{ 

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

     ArrayList<Text> result = new ArrayList<Text>(); 
     String key1 = key.toString(); 

    // check if the key is equal to check 
     if (key1.equals(check)){ 
      result.add(new Text("o")); 
     }else{ 
      result.add(new Text("x")); 
     } 

    // other reducing code 
    } 
} 

問題

checkは "a"、 "b"、 "c"に割り当てられないので、3つの出力ファイルすべてがチェックされていません。

どうすればこの問題を解決できますか?

答えて

1

mainメソッドはクライアントで実行されていますが、マッパーとレデューサーはHadoopノードで実行されています。マップ還元ジョブにパラメータを渡すには、Configurationオブジェクトを使用できます。あなたのmain方法の設定値で

conf.set("check", check); 

そして中にそれを得る減らす:

check = context.getConfiguration().get("check"); 

あなたがデータを処理する前に一度だけ、この値を設定する方法Reducer.setupを使用することができます。

+0

ありがとうございます!出来た! – EyTea

関連する問題