我使用Hadoop / Mapreduce计算数字的平均值 结构
guid banid countview
g1 b1 1
g1 b2 1
g1 b1 2
g1 b1 1
g2 b1 1
g2 b2 1
g2 b1 1
g2 b3 1
g3 b1 1
我想要guid的每个banid的平均值 countview ? (我的头脑是平均= 5/2与guid g1(2是总数另一个banid:b1,b2))
答案 0 :(得分:2)
因此,如果我理解您的要求,您正在寻找的答案可能如下:
g1 b1 1
g1 b2 1
g1 b1 2
g1 b1 1
" g1"的平均值= 5/2(总计数/独特的banid计数)
首先,您需要将问题分解为Map和Reduce阶段。目的是将每个" guid"的所有计数和禁令分组。在减速机中。
<强>映射器:强>
输出键/值类型:文本/文本
输出键可能是包含guid的Text Writable。该值将包含banid和count(即b1:1)。这将对每个guid的所有banid和计数进行分组。
<强>减速机:强>
输出键/值类型:Text / FloatWritable
现在,您将获得Key中每个guid的Text对象列表。遍历每个Value对象,将banid和count分开。创建一组banids并在迭代时对计数求和。一旦你完成了这个,你应该能够计算出平均值。将平均值写为FloatWritable(或Text ..由您决定)。 Key将与reduce的输入键相同。
这是处理需要包含多条信息的值的简单方法。更高级的方法是创建自己的Writable对象来包装Text和VIntWritable对象。