数据中的每一行都采用以下格式:
用户 ID、性别、年龄
我们需要回答以下2个问题:
1)有多少男性和多少女性。
2) 50 岁以上有多少,50 岁以下有多少。
有没有办法在一个 Map Reduce 工作中同时回答这两个问题?我知道我可以在 2 个单独的 MR 作业中轻松做到这一点,但希望避免两次读取同一个文件。我怎样才能只在一项 MR 工作中做到这一点?
在映射阶段,您可以为每条记录输出 2 个键:
将 count 1 作为值并在 reduce 阶段求和,这将为您提供您正在寻找的 4 个值,或者输出 1 个带有组合信息的键:
在减少阶段将计数 1 相加,为您提供 4 个组合值,您可以使用这些值通过添加计数对来获得所需的答案。
假设您的映射器到 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。
我想我回答了我自己的问题。以下会起作用,对吧?
映射器:
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 岁以下”,这就是我的答案,对吧?