BigData_A_A_03-YARN-資源管理和任務排程(2)共同好友(hadoop)
阿新 • • 發佈:2018-12-31
楔子
hadoop 統計共同好友
demo
思路是 兩次遍歷,按照 他倆是不是直接好友,如果是直接好友,輸出 key(friendA + “:” + friendB) value(0)
如果 他倆是同一個人的好友 輸出 key(friendA + “:” + friendB) value(0)
在根據 key分組求和,和就是他倆的共同好友個數
但是需要注意,還需要判斷,如果他倆是直接好友,注意 他倆是不是其他人的間接好友
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 資料 格式是 tom hello hadoop cat(每個人和他的好友以空格分隔)
String[] split = StringUtils.split(value.toString(), ' ');
String user = split[0];
for (int i = 1; i < split.length; i++) {
mkey.set(friends(user, split[i]));
mval.set(0);
context.write(mkey, mval);
System. out.println(mkey.toString() + mval);
// 如果 A 和B 是直接 好友就輸出 A:B 0
for (int j = i + 1; j < split.length; j++) {
mkey.set(friends(split[j], split[i]));
mval.set(1);
// 如果 A 和B 是間接 好友就輸出 A:B 1;然後對key分組就和 和就是他們有多少共同好友
context.write(mkey, mval);
System.out.println(mkey.toString() + mval);
}
}
}
Reducer
@Override
protected void reduce(Text key, Iterable<IntWritable> val, Context context)
throws IOException, InterruptedException {
// 對 key 求和
// hadoop:hello 1
// hadoop:hello 0
// hadoop:hello 1
// hadoop:hello 1
int sum = 0;
// 是否是直接好友,因為存在這種情況,他倆是直接好友,但是他倆同時也是別人的間接好友,這種情況排除
boolean flag = true;
for (IntWritable v : val) {
if (v.get() == 0) {
flag = false;
}
sum += v.get();
}
// 如果不是直接好友輸出
if (flag) {
rval.set(sum + "");
context.write(key, rval);
}
}
程式碼和資料位置
https://github.com/qianlicao51/hd/tree/master/src/main/java/cn/sxt/day1/hdfs/fof