データの各行は、次の形式で提供されます。
UserId、Sex、Age
次の2つの質問に答える必要があります。
1)男性の数と女性の数。
2)50年以上の数と50年未満の数。
1つのMapReduceジョブでこれらの両方に答える方法はありますか?これは2つの別々のMRジョブで簡単に実行できることはわかっていますが、同じファイルを2回読み取ることは避けたいと思います。1つのMRジョブでこれを行うにはどうすればよいですか?
map フェーズでは、すべてのレコードに対して 2 つのキーを出力できます。
カウント 1 を値として使用し、reduce フェーズで合計すると、探している 4 つの値が得られます。または、組み合わせた情報を含む 1 つのキーが出力されます。
カウント 1 を reduce フェーズで合計すると、4 つの結合値が得られます。これを使用して、カウントのペアを追加することで、必要な答えを得ることができます。
マッパーのレデューサーへの出力は、context.write(CONSTANT_KEY, VALUE);
keyがCONSTANTであり、VALUEが連結された文字列であるようなものであると仮定します"X,Y"
。X
{1,0}のいずれかで1つの値を保持できます。ここで、1は男性を表し、0は女性を表します。Y
{1,0}のいずれかに1つの値を保持できます。ここで、1は年齢> 50を表し、0は年齢<50を表します。現在、Reducerクラスでは、 StringTokenizerクラスを使用して、フィールドXおよびYの1と0の数を簡単に数えることができます。唯一の欠点は、KEYがCONSTANTであるため、レデューサーが1つしかないことです。
私は自分の質問に答えたと思います。以下は機能しますよね?
マッパー:
if (Male)
emit("Male", 1)
else
emit("Female", 1)
if (Age > 50)
emit("Over 50", 1)
else
emit("Under 50", 1)
これで、これらは「男性」、「女性」、「50 歳以上」、「50 歳未満」の 4 つの異なるキーを持つ 4 つの異なるレデューサーに移動し、私の答えがありますよね?