版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012848709/article/details/85238996
楔子
最近看了hadoop求共同好友,也了解一些spark基本编程,感觉 思路 一致,可以试试spark
demo
是否是直接好友,因为存在这种情况,他俩是直接好友,但是他俩同时也是别人的间接好友,这种情况排除
,因此两次flatMap
,第二次就是为了排除第一次 中包含的他俩是直接好友的情况,但是这种存在一个问题,排除使用的是集合的操作,如果数据量大,可能有问题。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.storage.StorageLevel;
import cn.sxt.config.HadoopConfig;
import cn.zhuzi.spark.official.SparkUtils;
import scala.Tuple2;
public class SparkFof {
public static void main(String[] args) {
JavaSparkContext jsContext = SparkUtils.getJavaSparkContext();
JavaRDD<String> textFile = jsContext.textFile(HadoopConfig.getInputPath("data/sxt/friend"));
textFile.persist(StorageLevel.MEMORY_AND_DISK_SER());
JavaRDD<String> flatMap = textFile.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String t) throws Exception {
ArrayList<String> resuList = new ArrayList<String>();
String[] split = t.split(" ");
// 此处只是给 一个人的共同好友佩对 比如 tom hello hadoop cat
// 就输出 hello:hadoop ,hello:cat ,hadoop:cat ,
// 然后 按照 Wordcount 那样求和 此处出现 一个问题,
// TODO 这样计算过程中,他俩是别人的好友,可能存储在他俩是直接好友
for (int i = 1; i < split.length; i++) {
for (int j = i + 1; j < split.length; j++) {
resuList.add(FofMapper.friends(split[i], split[j]));
}
}
return resuList.iterator();
}
});
// 直接好友
JavaRDD<String> flatMapFriend = textFile.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String t) throws Exception {
ArrayList<String> resuList = new ArrayList<String>();
String[] split = t.split(" ");
for (int i = 1; i < split.length; i++) {
resuList.add(FofMapper.friends(split[i], split[0]));
}
return resuList.iterator();
}
});
ArrayList<String>list =new ArrayList<String>(flatMap.collect()) ;// flatMap的集合不可修改
ArrayList<String> collect2 = new ArrayList<String>(flatMapFriend.collect());
list.removeAll(collect2);
// flatMap中药排除他俩是直接好友
JavaRDD<String> parallelize = jsContext.parallelize(list);
JavaPairRDD<String, Integer> mapToPair = parallelize.mapToPair(t -> new Tuple2<String, Integer>(t, 1));
// 分组聚合
JavaPairRDD<String, Integer> res = mapToPair.reduceByKey((a, b) -> a + b);
List<Tuple2<String, Integer>> collect = res.collect();
for (Tuple2<String, Integer> tuple2 : collect) {
System.out.println(tuple2);
}
jsContext.close();
}
}