0

数据中的每一行都采用以下格式:

用户 ID、性别、年龄

我们需要回答以下2个问题:

1)有多少男性和多少女性。

2) 50 岁以上有多少,50 岁以下有多少。

有没有办法在一个 Map Reduce 工作中同时回答这两个问题?我知道我可以在 2 个单独的 MR 作业中轻松做到这一点,但希望避免两次读取同一个文件。我怎样才能只在一项 MR 工作中做到这一点?

4

3 回答 3

1

在映射阶段,您可以为每条记录输出 2 个键:

  • 年轻/年老
  • 男/女

将 count 1 作为值并在 reduce 阶段求和,这将为您提供您正在寻找的 4 个值,或者输出 1 个带有组合信息的键:

  • 年轻男性/老男性/年轻女性/老女性

在减少阶段将计数 1 相加,为您提供 4 个组合值,您可以使用这些值通过添加计数对来获得所需的答案。

于 2012-09-12T13:12:02.593 回答
0

假设您的映射器到 reducer 的输出就像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,所以只有一个 reducer。

于 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)

现在这些将转到具有 4 个不同键的 4 个不同的减速器:“男性”、“女性”、“50 岁以上”和“50 岁以下”,这就是我的答案,对吧?

于 2012-09-12T13:55:11.560 回答