2016-09-28 8 views
0

例えば、典型的なWORDCOUNTのMapReduceは読み込み出力返す可能性があります:私は少し違っているので、出力をフォーマットしたい再びキー/値の代わりにHadoop MapReduceジョブの出力を値/キーとして返すにはどうすればよいですか?

ハロー3
世界4

をそれ代わりに次のように表示されます。

3 hello
4世界
1再び

私は値でソートしたい記事をたくさん読んだと回答は、最初の1の出力に第二のMapReduceジョブを示唆しました。しかし、私は値で並べ替える必要はなく、複数のキーが同じ値を持つ可能性もあります - 私はそれらを一緒に束ねたくありません。

キー/値の印刷順序を簡単に切り替える簡単な方法はありますか?それは簡単なように思える。安心のために考慮すべき

+0

レデューサーコードの出力の順序を切り替えようとしましたか? –

+0

また、Spark(とはるかに少ないコード)で行うのは非常に簡単です。 –

答えて

1

二つのオプションは以下のとおりです。

は削減

にキー/値の切り替えキーと値を切り替えるように減らすからの出力を変更します。たとえばに変更しますHadoops example WordCount jobに削減:ここcontext.write(result, key);

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
      sum += val.get(); 
     } 
     result.set(sum); 
     context.write(result, key); 
    } 
} 

は、キーと値を切り替えるように変更されました。

は、あなたがキーと値を切り替えるように地図だけ(0レデューサー)ジョブを実行するためのHadoopが提供するInverseMapperSource)を使用することができる第2のマップ唯一の仕事

を使用してください。だから、あなただけの副業を持っているでしょう、とだけのようなものになり、ドライバ、記述する必要があります:あなたはSequenceFileOutputFormatを使用して最初の仕事の出力を書き込むための最初の仕事をしたいだろうと、

public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    Job job = Job.getInstance(conf, "Switch inputs"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(InverseMapper.class); 
    job.setNumReduceTasks(0); 
    job.setOutputKeyClass(IntWritable.class); 
    job.setOutputValueClass(Text.class); 
    job.setInputFormatClass(SequenceFileInputFormat.class); 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
} 

注意をし、 2番目の入力にはSequenceFileInputFormatを入力してください。

関連する問題