两个映射减少作业并将每个作业的减少值合并为一个包含两个值的列表

时间:2015-04-07 19:38:09

标签: java hadoop dictionary mapreduce reduce

我正在编写一个MapReduce程序,要求我查找节点(000-999)的入站和出站链接数,本质上是一个web图处理器。我需要返回一个特定节点作为键,并将每个文档的out-degree和in-degree作为值。例如,

示例文本文件:

000 002
001 002
002 000
001 000

应该返回:

000 1 2
001 2 0
002 1 2

根据我的逻辑,似乎我需要创建两个map reduce作业,第一个传入LongWritable键,其值为节点对(例如000 002),计算每个节点的出站链接数并在减速器阶段结束时返回类似(000 1)的内容。然后我会通过翻转节点对(例如000 002变为002 000)并找到那些出站链接的计数来找到文档的度数(在上面的例子中,这将返回(000 2))。然后我需要将这些值组合起来以得到(000 1 2)的最终输出。是创建两个映射作业的最佳方法,并以某种方式将这两个值连接到两个值的列表中?如果我使用java(而不是Hive)来编写代码,有没有办法加入这些值?有没有更简单,更有效的方法来解决这个问题?

编辑:对于这个程序,映射器功能是相同的,因为我只是将两个值(000 002到002 000)切换,以便以完全相同的方式计算入站路径和出站路径。 reducer函数也完全相同,但它需要在两个单独的作业上运行,因此我不会将最终值作为in-degree和out-degree的总和。我需要返回in-degree,然后返回out-degree并将它们附加到值列表中。

2 个答案:

答案 0 :(得分:0)

我的建议是使用复杂的String制作更复杂的中间格式。您可能需要的只是为您的减速器形成CSV格式。

对于每个进入减速器的线路,输入的第一行将有2个不同的节点:000和002。 做一个'#'分隔的字符串如:

context.write(new Text("000"),new Text("LeftToRight#1"));
context.write(new Text("002"),new Text("RightToLeft#1"));

稍后在reducer中你可以单独计算所有LeftToRights和RightToLeft,并为它们输出。

要在单个文件中获取输出:将reducer的数量设置为1。

答案 1 :(得分:0)

假设你想做其他事情,然后计算给定顶点的程度,我建议使用jgrapht,这是一个Java类库,为图论提供对象和算法。

请参阅inDegreeOf以解决您的问题。