spark求共同好友

使用spark求共同好友:

在做一些项目时,又时可能遇到一些类似与求共同好友的要求,可以根据共同好友进行推荐添加好友,就比如说A和B的好友有M,K,O,L,那么有可能A和B就是也认识,所以可以把B推荐给A,下面是用Spark求共同好友的实现

数据格式如下
A:B,D,E,H,I,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:B,C,D,E,O,M

在这里插入图片描述


import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object CommFriend {
  def main(args: Array[String]): Unit = {
    var Array(inputPath,outputPath) = args
    inputPath = "D:\\tools\\qianfeng\\hadoop\\Mapreduce\\day09Mapreduce\\fr.txt"
    val conf = new SparkConf().setAppName(s"${this.getClass.getName}").setMaster("local")
    val sc = new SparkContext(conf)
    val lines = sc.textFile(inputPath)
    val friendAndPerson: RDD[(String, List[String])] = lines.flatMap(m => {
      val sp = m.split(":")
      val str: String = sp(0)
      val sp1= sp(1).split(",")
      val tuples: Array[(String, List[String])] = sp1.map(t => {
        //val t: String = t
        //一个好友对应一个人
        (t,List(str))
      })
      tuples
    })
  


    //(friend,persons)  把好友相同的人进行聚合
    val friAndPers: RDD[(String, List[String])] = friendAndPerson.reduceByKey((list1, list2) => {
      list1 ::: list2
    })
   
    //每两个人之间的共同好友
    val ppAndcomFri: RDD[(String, String)] = friAndPers.flatMap(t => {
      val sortedFriend: List[String] = t._2.sortBy(x => x) //这样可以避免重复出现 A-B 的好友是C ,和 B-A 的好友是C一样
      val friend: String = t._1 //共同好友
      var commFriends: List[(String, String)] = List[(String, String)]()
      for (i <- 0 until sortedFriend.length) {  //自己和自己不能是好友,且不能重复
        /*
        E  List(A, B ,C) ABC 都有共同好友是E,可以得到 (A-B,E)(A-C,E)(B-C,E)
        对于 B List(N) 代表 只有N有好友B,所以这种就被满足循环条件
         */
        for (j <- i + 1 until sortedFriend.length) {
          //谁跟谁是共同好友(xx-nn,mm) xx 和 nn 的共同好友是 mm
          val tuple: (String, String) = (sortedFriend(i) + "-" + sortedFriend(j), friend)
          commFriends = commFriends ::: List(tuple)
        }
      }
      commFriends
    })

  
    // a-b 的共同好友有n m d h f 。。。
    val gbk: RDD[(String, Iterable[String])] = ppAndcomFri.groupByKey()
    println(gbk)
    gbk.map(m=>{
      (m._1, m._2.mkString(","))
    })
    .coalesce(1).saveAsTextFile(outputPath)

  }

}

猜你喜欢

转载自blog.csdn.net/Lu_Xiao_Yue/article/details/84502558
今日推荐