首页 文章

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

提问于
浏览
0

我在HDFS上有 two very large datasets (表格) . 我想在某些列上使用 join them ,然后在某些列上使用 group them ,然后在某些列上使用 perform some group functions .

My steps are:

1-创建两个作业 . 2-在第一个作业中,在映射器中将每个数据集的行读取为映射输入值,并将连接列的值作为映射输出键和剩余列的值作为映射输出值发出 . 映射之后,MapReduce框架执行混洗并根据映射输出键对所有映射输出值进行分组 . 然后,在reducer中,它读取每个map输出键及其值,其中包含来自两个数据集的许多行 . 我想要的是多次迭代减少输入值,以便我可以执行笛卡尔积 . 为了说明:假设对于连接键x,我有一个数据集的100个匹配和另一个数据集的200个匹配 . 这意味着在连接键x上加入它们会产生100 * 200 = 20000组合 . 我希望将NullWritable作为reduce输出键和每个笛卡尔积作为减少输出值 . 示例输出可能是:for join key x:From(nullWritable),(first(1),second(1))Over(nullWritable),(first(1),second(200))To(nullWritable),(first (100),second(200))我该怎么做?我只能迭代一次 . 我无法兑现 Value 观,因为它们不适合记忆 . 3-如果我这样做,我将开始第二个作业,它将第一个作业的结果文件作为输入文件 . 在映射器中,我将组列的值作为映射输出键发出,其余列的值作为映射输出值 . 然后在reducer中迭代每个键的值,我在一些列上执行一些函数,如sum,avg,max,min .

非常感谢提前 .

1 回答

  • 0

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

相关问题