1. 程式人生 > >BigData_A_A_03-YARN-資源管理和任務排程(2)共同好友(hadoop)

BigData_A_A_03-YARN-資源管理和任務排程(2)共同好友(hadoop)

楔子

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