一对字符串作为减少函数中的KEY - HADOOP

时间:2016-05-29 16:19:11

标签: java hadoop mapreduce

您好我正在使用hadoop框架在java中实现类似facebook的程序(我是新手)。主要的想法是我有一个输入.txt文件,如下所示:

  克里斯蒂娜比尔,詹姆斯,尼克,杰西卡   詹姆斯克里斯蒂娜,玛丽,托比,尼克   ...

第一个是用户,逗号分隔的是他的朋友。

在地图功能中,我扫描文件的每一行,并向每个朋友发送用户,如

  

Christina Bill
  克里斯蒂娜詹姆斯

将转换为(Christina,[Bill,James,..]) ...

但在我的赋值说明中,它指定Reduce函数将接收元组的关键字 两个用户,他们的朋友,你会计算 常见的,如果该数字等于或大于a 设定数量,如5,你可以放心地假设他们的 可以建议不寻常的朋友。那么我究竟如何将一对用户传递给reduce函数。我认为reduce函数的输入必须与map函数的输出相同。我开始编码,但我不认为这是正确的方法。有什么想法吗?

public class ReduceFunction<KEY> extends Reducer<KEY,Text,KEY,Text> {
private Text suggestedFriend = new Text();

public void reduce(KEY key1,KEY key2, Iterable<Text> value1,Iterable<Text> value2,Context context){
}}

2 个答案:

答案 0 :(得分:0)

检查您是否可以实现custom record reader,从mapper class的输入文件中一次读取两条记录。然后从mapper类中发出context.write(outkey, NullWritable.get());。现在在reducer class中,您需要处理来自mapper类的两个记录(outkey)。祝你好运!

答案 1 :(得分:0)

映射阶段的输出实际上应与reduce阶段的输入具有相同的类型。这意味着,如果需要输入reduce阶段,则必须更改映射器。

这个想法很简单:

map(user u,friends F):
for each f in F do
    emit (u-f, F\f)

reduce(userPair u1-u2, friends F1,F2):
#commonFriends = |F1 intersection F2|

要实现此逻辑,您可以使用Text键,在其中连接用户的名称,例如,使用它们之间的“ - ”字符。

请注意,在每个reduce方法中,您只会收到两个朋友列表,假设每个用户在输入数据中出现一次。然后,您只需要比较朋友的常用名称的两个列表。