软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > scala >
找出共同好友 - 数据挖掘 - Scala版
发布于:第八基地 来源:cnblogs 作者:天堂路上 时间:2018-01-18 点击:285

大家好,关于“找出共同好友”的算法,网上有不少语言的实现,今天有空之余,自己研究了下Scala算法的写法

完整代码可以参考Git地址:https://github.com/benben7466/SparkDemo/blob/master/spark-test/src/main/scala/testCommendFriend.scala

 

录入的数据:

A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
G:A,C,D,E,F
H:A,C,D,E,O
I:A,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J

 

核心算法:

 1 package chunbo.recommend
 2 
 3 import org.apache.spark.SparkContext
 4 
 5 //共同好友统计问题
 6 //参考:http://www.cnblogs.com/charlesblc/p/6126346.html
 7 object testCommendFriend {
 8   def index(_spark_sc: SparkContext): Unit = {
 9 
10     //获取数据
11     val friendRDD = _spark_sc.textFile(Config.HDFS_HOSH + "test/common_friend")
12 
13     //map
14     val friendKV = friendRDD.map(x => {
15       val fields = x.split(":")
16       val person = fields(0)
17       val friends = fields(1).split(",").toList
18       (person, friends)
19     })
20 
21     val mapRDD = friendKV.flatMap(x => {
22       for (i <- 0 until x._2.length) yield (x._2(i), x._1)
23     })
24 
25     //reduce
26     val reduceRDD = mapRDD.reduceByKey(_ + "::" + _)
27 
28     //打印
29     reduceRDD.foreach(println)
30 
31   }
32 
33 }

 

输出数据如下:

(L,D::E)
(B,A::E::F::J)
(J,O)
(H,O)
(F,A::C::D::G::L::M)
(D,A::C::E::F::G::H::K::L)
(G,M)
(M,E::F)
(O,A::F::H::I::J)
(A,B::C::D::F::G::H::I::K::O)
(I,C::O)
(K,B)
(C,A::B::E::F::G::H::K)
(E,A::B::D::F::G::H::L::M)

说明:

以逗号作为分割,左边的表示是右边集合的共同好友。

比如 (L,D::E),表示L是用户D和E的共同好友

 

 

 

参考:http://www.cnblogs.com/charlesblc/p/6126346.html

对我有帮助
(0)
0%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈