0

IntWritable私は、 1 2 または 3 のテキスト キーと値を与える Mapper クラスを持っています。値に応じて、異なるキーを持つ 3 つの異なるファイルを作成する必要があります。レコードが含まれていない単一ファイル出力を取得しています。また、あなたが私を導くことができる良い複数の出力の例(説明付き)はありますか?

私のドライバークラスには次のコードがありました:

    MultipleOutputs.addNamedOutput(job, "name", TextOutputFormat.class, Text.class,     IntWritable.class);
    MultipleOutputs.addNamedOutput(job, "attributes", TextOutputFormat.class, Text.class, IntWritable.class);
    MultipleOutputs.addNamedOutput(job, "others", TextOutputFormat.class, Text.class, IntWritable.class);

私のレデューサークラスは次のとおりです。

public static class Reduce extends Reducer<Text, IntWritable, Text, NullWritable> {

    private MultipleOutputs mos;
    public void setup(Context context) {
        mos = new MultipleOutputs(context);
    }
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        String CheckKey = values.toString();
        if("1".equals(CheckKey)) {
            mos.write("name", key, new IntWritable(1));
        }
        else if("2".equals(CheckKey)) {
            mos.write("attributes", key, new IntWritable(2));
        }
        else if("3".equals(CheckKey)) {
            mos.write("others", key,new IntWritable(3));
        }

        /* for (IntWritable val : values) {
            sum += val.get();
        }*/
        //context.write(key, null);
    }
    @Override
    public void cleanup(Context context) throws IOException, InterruptedException {
        mos.close();
    }
}

PS HADOOP/MAP-Reduce プログラミングは初めてです。

4

2 に答える 2

0

あなたの問題文は混乱しています。「価値観次第」とは?レデューサーは、単一の値ではなく、値の Iterable を取得します。合計を取得するためにコメントアウトしたループ内のリデューサーで複数の出力コードを移動する必要があることを教えてくれます。

あるいは、reducer をまったく必要とせず、map フェーズでこれを処理できる場合もあります。reduce フェーズを使用して、1 つの reduce タスクを使用して正確に 4 つのファイルを作成している場合は、map フェーズでキーと値を反転し、MultipleOutputs を完全に忘れることで、目的を達成することもできます。 int値ごとに1つずつ、3つの作業削減タスクのみで構成されています。4 番目のものを取得するには、特別なキーを使用して各マップ呼び出しでレコードの 2 つのコピーを出力し、出力が 3 つの特別なファイルの 1 つではなく、通常のファイルを対象としていることを示します。通常、キーの数が少ない場合、reduce フェーズで達成できる並列処理のレベルには厳しい制限があるため、このような一連のアクションはお勧めしません。

また、予期している 3 つの値のいずれでもない値に遭遇した場合にカウンターまたは何かをインクリメントする「if」はしごの最後に、異常なデータ処理コードを含める必要があります。

于 2013-10-04T13:16:02.827 に答える