两个地图缩减作业并将每个作业的缩减值加入一个包含两个值的列表
Two map reduce jobs and joining reduced values of each job into one list of two values
我正在编写一个 MapReduce 程序,要求我查找节点 (000-999) 的入站和出站链接数,本质上是一个网络图形处理器。我需要 return 一个特定的节点作为键,每个文档的出度和入度作为值。例如,
示例文本文件:
000 002
001 002
002 000
001 000
应该return:
000 1 2
001 2 0
002 1 2
按照我的逻辑,似乎我需要创建两个 map reduce 作业,第一个传入一个值为节点对(例如 000 002)的 LongWritable 键,计算出站链接的数量每个节点和 returning 在减速器阶段结束时类似 (000 1) 的东西。然后我将通过翻转节点对(例如 000 002 变为 002 000)并找到那些出站链接的计数(在上面的示例中,这将 return (000 2 )).然后我需要组合这些值以生成 (000 1 2) 的最终输出。创建两个地图作业并以某种方式将这两个值连接到一个包含两个值的列表中的最佳方法是什么?如果我使用 java(不是 Hive)对此进行编码,是否可以加入这些值?有没有更简单有效的方法来解决这个问题?
编辑:对于这个程序,映射器的功能是相同的,因为我只是切换两个值(000 002 到 002 000)以便以完全相同的方式计算入站路径和出站路径。 reducer 函数也完全相同,但它需要在两个单独的作业上为 运行,因此我没有收到作为入度和出度之和的最终值。我需要 return 入度,然后 return 出度并将它们附加到值列表中。
我的建议是使用复杂的字符串制作更复杂的中间格式。您可能只需要为您的减速器形成一个 CSV 格式。
对于进入减速器的每一行,在输入的第一行中都会有 2 个不同的节点:000 和 002。
制作一个“#”分隔的字符串,例如:
context.write(new Text("000"),new Text("LeftToRight#1"));
context.write(new Text("002"),new Text("RightToLeft#1"));
稍后在减速器中,您可以分别计算所有 LeftToRights 和 RightToLeft 并为它们输出。
要在单个文件中获取输出:将 reducer 数量设置为 1。
假设您想做其他事情然后计算给定顶点的度数,我建议使用 jgrapht,一个 Java class 库,它为图提供对象和算法理论。
请参阅 inDegreeOf 作为您问题的解决方案。
我正在编写一个 MapReduce 程序,要求我查找节点 (000-999) 的入站和出站链接数,本质上是一个网络图形处理器。我需要 return 一个特定的节点作为键,每个文档的出度和入度作为值。例如,
示例文本文件:
000 002
001 002
002 000
001 000
应该return:
000 1 2
001 2 0
002 1 2
按照我的逻辑,似乎我需要创建两个 map reduce 作业,第一个传入一个值为节点对(例如 000 002)的 LongWritable 键,计算出站链接的数量每个节点和 returning 在减速器阶段结束时类似 (000 1) 的东西。然后我将通过翻转节点对(例如 000 002 变为 002 000)并找到那些出站链接的计数(在上面的示例中,这将 return (000 2 )).然后我需要组合这些值以生成 (000 1 2) 的最终输出。创建两个地图作业并以某种方式将这两个值连接到一个包含两个值的列表中的最佳方法是什么?如果我使用 java(不是 Hive)对此进行编码,是否可以加入这些值?有没有更简单有效的方法来解决这个问题?
编辑:对于这个程序,映射器的功能是相同的,因为我只是切换两个值(000 002 到 002 000)以便以完全相同的方式计算入站路径和出站路径。 reducer 函数也完全相同,但它需要在两个单独的作业上为 运行,因此我没有收到作为入度和出度之和的最终值。我需要 return 入度,然后 return 出度并将它们附加到值列表中。
我的建议是使用复杂的字符串制作更复杂的中间格式。您可能只需要为您的减速器形成一个 CSV 格式。
对于进入减速器的每一行,在输入的第一行中都会有 2 个不同的节点:000 和 002。 制作一个“#”分隔的字符串,例如:
context.write(new Text("000"),new Text("LeftToRight#1"));
context.write(new Text("002"),new Text("RightToLeft#1"));
稍后在减速器中,您可以分别计算所有 LeftToRights 和 RightToLeft 并为它们输出。
要在单个文件中获取输出:将 reducer 数量设置为 1。
假设您想做其他事情然后计算给定顶点的度数,我建议使用 jgrapht,一个 Java class 库,它为图提供对象和算法理论。
请参阅 inDegreeOf 作为您问题的解决方案。