在MapReduce作业的Reducer中通过Text输入值多次迭代

时间:2014-08-31 00:04:35

标签: java hadoop mapreduce reduce iterable

我在HDFS上有两个非常大的数据集(表格)。我想在某些列上加入,然后在某些列上将它们分组,然后执行某些组功能一些专栏。

我的步骤是:

  

1-创建两个职位。

     

2-在第一个作业中,在mapper中将每个数据集的行读取为map   输入值并发出加入列'值作为地图输出键和   其余列'值作为地图输出值。

     

映射后,MapReduce框架执行改组和组   根据地图输出键的所有地图输出值。

     

然后,在reducer中,它读取每个map输出键及其包含的值   两个数据集中的许多行。

     

我想要的是多次迭代减少输入值,以便我可以执行笛卡尔积。

     

举例说明:

     

让我们说连接键x,我有一个数据集和100个匹配   另外200场比赛。这意味着在连接键x上加入它们   产生100 * 200 = 20000组合。我想发出NullWritable作为   减少输出键和每个笛卡儿   产品作为减产值。

     

示例输出可能是:

     

用于连接键x:

     

From(nullWritable),(first(1),second(1))

     

Over(nullWritable),(first(1),second(200))

     

To(nullWritable),(first(100),second(200))

     

我该怎么做?

     

我只能迭代一次。我无法兑现价值观,因为它们不适合记忆。

     

3-如果我这样做,我将开始第二个工作,这是第一个工作   作业的结果文件作为输入文件。在mapper中,我发出了组列'   值作为地图输出键,其余列为'值作为地图   产值。然后在reducer中迭代每个键的值,I   在sum,avg,max,min。等某些列上执行某些功能。

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

由于您的第一个MR作业使用连接键作为地图输出键,因此您的第一个缩减器将为每个reduce调用获取(K join_key,List< V>值)。您可以做的只是将两个单独的值分成两个单独的列表,每个列表用于数据源,并使用嵌套for循环来执行笛卡尔积。