目录
任务描述
本关任务:使用 Spark Core
知识完成 " 好友推荐 " 的程序。
相关知识
直接好友与间接好友
参照数据如下:
hello hadoop cat
world hadoop hello hive
cat tom hive
...
...
数据说明(第二行为例): 这个人叫 world
,他有三个好友,分别是:hadoop
、hello
和 hive
。hadoop
、hello
和 hive
之间就是间接好友。word
与 hadoop
、 hello
、hive
属于直接好友。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
完成统计间接好友的数量。
统计间接好友的参照数据如下:
(world_tom,2)
(tom_mr,1)
(mr_hadoop,1)
...
...
参考数据说明:以 (world_tom,2)
为例,用户 world
与用户 tom
在间接好友关系中出现的次数为 2
。
特别说明:(world_tom,2)
与 (tom_world,2)
属于同一数据,请使用 hashcode
来排列用户 world
与 用户 tom
的前后顺序。
测试说明
平台会对你的命令进行检验并运行,你只需要按照任务需求,补充右侧编辑器的代码,然后点击评测就ok
了。
预期结果:
(world_tom,2)
(tom_mr,1)
(mr_hadoop,1)
(cat_mr,1)
(world_cat,1)
(cat_hadoop,2)
(hive_tom,3)
(world_mr,2)
参考答案
package net.educoder;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;
import java.util.ArrayList;
import java.util.List;
public class Step2 {
private static SparkConf conf;
private static JavaSparkContext sc;
static {
conf = new SparkConf().setAppName("step2").setMaster("local");
sc = new JavaSparkContext(conf);
}
/**
*
* @return JavaPairRDD<String, Integer>
*/
public static JavaPairRDD<String, Integer> fun2() {
JavaRDD<String> rdd = sc.textFile("/root/friend.txt");
/**-------------------------------beign-----------------------------------**/
JavaPairRDD<String, Integer> rdd1 = rdd.flatMapToPair(line -> {
List<Tuple2<String, Integer>> list = new ArrayList<Tuple2<String, Integer>>();
String[] split = line.split(" ");
String me = split[0];
for (int i = 1; i < split.length; i++) {
String s = me.hashCode() > split[i].hashCode() ? me + "_" + split[i] : split[i] + "_" + me;
list.add(new Tuple2<>(s, 0));
for (int j = i + 1; j < split.length; j++) {
String ss = split[j].hashCode() > split[i].hashCode() ? split[j] + "_" + split[i] : split[i] + "_" + split[j];
list.add(new Tuple2<>(ss, 1));
}
}
return list.iterator();
});
JavaPairRDD<String, Iterable<Integer>> rdd2 = rdd1.groupByKey();
//同一组内的数据若有直接好友关系,整组删除。否则计数累加
JavaPairRDD<String, Integer> javaPairRDD = rdd2.mapToPair(x -> {
boolean bool = false;
int count = 0;
Iterable<Integer> flags = x._2();
String name = x._1();
for (Integer flag : flags) {
if (flag == 0) {
bool = true;
}
count++;
}
if (bool == false) {
return new Tuple2<String, Integer>(name, count);
} else {
return new Tuple2<String, Integer>("直接好友", 0);
}
});
JavaPairRDD<String, Integer> filter = javaPairRDD.filter(x -> x._2() != 0 ? true : false);
return filter;
/**-------------------------------end-----------------------------------**/
}
}