0

データの各行は、次の形式で提供されます。

UserId、Sex、Age

次の2つの質問に答える必要があります。

1)男性の数と女性の数。

2)50年以上の数と50年未満の数。

1つのMapReduceジョブでこれらの両方に答える方法はありますか?これは2つの別々のMRジョブで簡単に実行できることはわかっていますが、同じファイルを2回読み取ることは避けたいと思います。1つのMRジョブでこれを行うにはどうすればよいですか?

4

3 に答える 3

1

map フェーズでは、すべてのレコードに対して 2 つのキーを出力できます。

  • 古い若いです
  • 男女

カウント 1 を値として使用し、reduce フェーズで合計すると、探している 4 つの値が得られます。または、組み合わせた情報を含む 1 つのキーが出力されます。

  • 若い男性/古い男性/若い女性/古い女性

カウント 1 を reduce フェーズで合計すると、4 つの結合値が得られます。これを使用して、カウントのペアを追加することで、必要な答えを得ることができます。

于 2012-09-12T13:12:02.593 に答える
0

マッパーのレデューサーへの出力は、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つしかないことです。

于 2012-09-12T05:47:30.637 に答える
0

私は自分の質問に答えたと思います。以下は機能しますよね?

マッパー:

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 つの異なるレデューサーに移動し、私の答えがありますよね?

于 2012-09-12T13:55:11.560 に答える