BigData_A_A_03-YARN-资源管理和任务调度(2)共同好友(spark)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();

	}
}

猜你喜欢

转载自blog.csdn.net/u012848709/article/details/85238996