spark好友推荐

来源:互联网 发布:数据安全管理规范 编辑:程序博客网 时间:2024/06/04 08:27

好友推荐:有好多推荐方式,比如根据兴趣爱好去推荐,根据朋友的盆友去推荐等等,这里不再赘述,这个比较经典的问题,大家肯定都知道吧,或许很多人指导用hadoop怎么去实现,这个问题如果用hadoop去实现,得用至少两次mapreduce去实现吧,这里先不去说明hadoop怎么去实现的,先看看数据,然后用spark去实现。
小明 老王 如花 林志玲
老王 小明 凤姐
如花 小明 李刚 凤姐
林志玲 小明 李刚 凤姐 郭美美
李刚 如花 凤姐 林志玲
郭美美 凤姐 林志玲
凤姐 如花 老王 林志玲 郭美美
先数据说明,数据是按照制表符分割的,第一个表示用户,其后表示该用户的好友。
下面介绍一种方法,就是根据好友的好友而不是自己好友的去推荐,可能会计算两个人在好友的关系中出现的次数等等。
如果出现的次数越高,他们两个人认识的可能性就会越高。
好了,代码献上:

“`
System.setProperty(“hadoop.home.dir”,”D:\hadoop\bin\winutils.exe”)
val conf = new SparkConf().setAppName(“friends”)
conf.setMaster(“local”)
val sc = new SparkContext( conf )

//如何求出间接朋友的关系

val rdd = sc.makeRDD( Array(
“小明\t老王\t如花\t林志玲”,
“老王\t小明\t凤姐”,
“如花\t小明\t李刚\t凤姐”,
“林志玲\t小明\t李刚\t凤姐\t郭美美”,
“李刚\t如花\t凤姐\t林志玲”,
“郭美美\t凤姐\t林志玲”,
“凤姐\t如花\t老王\t林志玲\t郭美美”
))
val res = rdd.map( line =>{
val pair = line.split(“\t”)
val friends = pair.slice( 1,pair.length )
( pair(0),friends)
})
val relation = res.flatMap{x => x._2.map( e =>( x._1,e ) )}
//用户好友之间的关系
val fof = relation.leftOuterJoin( relation ).map( x => ( x._2._1,x._2._2.getOrElse(“”) )).filter( x => x._1!= x._2)
val resverse = relation.map( x => x.swap ).union(relation).map( x =>(x,1)).distinct()
//过滤掉是直接好友的
val f = fof.map( x =>( x,1)).subtractByKey( resverse ).reduceByKey( + ).map( x =>( x._1._1,(x._1._2,x._2 )))
//求出给某个人推荐的人物列表,并且按照出现的次数排序从高到低
f.aggregateByKey(ArrayBuffer(String,Int))( :+, ++ ).mapValues( x =>
x.sortBy( -._2 )).map( x => x._1+”—>”+x._2.mkString(“\t”)).foreach( println( ) )

“`这只是我自己写这本地测试的,还有经过大量数据的测试性能,。
多地方坑内还:
要去优化。希望大家能给我指出更好的方法。实验结果如下:
小明—>(凤姐,3) (李刚,2) (郭美美,1)
如花—>(林志玲,3) (老王,2) (郭美美,1)
郭美美—>(小明,1) (李刚,1) (如花,1) (老王,1)
凤姐—>(小明,3)
林志玲—>(如花,3) (老王,2)
李刚—>(小明,2) (郭美美,1)
老王—>(林志玲,2) (如花,2) (郭美美,1)hadoop实现的版本后面奉上

0 0
原创粉丝点击