您好我正在使用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){
}}
答案 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方法中,您只会收到两个朋友列表,假设每个用户在输入数据中出现一次。然后,您只需要比较朋友的常用名称的两个列表。