计算最大的关系网络的Spark实现

from pyspark import SparkConf , SparkContext
conf = SparkConf().setMaster("local").setAppName("My app")
sc = SparkContext(conf=conf)
'''
从关系对的数据中,找出所有最大的互不关联的连通子网络
源数据格式为
1,2
2,3
4,5


节点的关联为是没有方向的
两个子网络分别为 1 2 3  和 4 5 
'''




#加载源数据
relation_rdd = sc.textFile("/user/hadoop/data/a.txt")
#print relation_rdd.first()


#去重
disticnt_relation_rdd = relation_rdd.distinct()
#print disticnt_relation_rdd.first()


#转成tuple
distinct_relation_pair_rdd = disticnt_relation_rdd.map(lambda x : (int(x.split(',')[0]) , int(x.split(',')[1]) ) )
#union 倒置的tuple后再次去重
relation_pair_rdd = distinct_relation_pair_rdd.union(distinct_relation_pair_rdd.map(lambda x : (x[1] , x[0]))).distinct()
relation_pair_rdd.persist()


#找出所有节点
distinct_node_rdd = relation_pair_rdd.flatMap(lambda x : [node for node in x ] ).distinct()
#为每个节点分配一个groupid,等于其节点ID
node_groupid_rdd = distinct_node_rdd.map(lambda x : (x , x))
node_groupid_rdd.persist()


while True : #不定次循环
    #关联后取较小的groupID
    relation_pair_latter_groupid_rdd = relation_pair_rdd.join(node_groupid_rdd)
    new_node_groupid_table =  relation_pair_latter_groupid_rdd.map(lambda x : x[1] ).reduceByKey( lambda x , y : min((x,y)) )
    #node_groupid_rdd.unpersist()
    #compare
    new_node_groupid_table.persist()
    #如果与原来的没有差别,则中止循环
    diff_cnt = new_node_groupid_table.subtract(node_groupid_rdd).count()
    print diff_cnt 
    if diff_cnt == 0:
        new_node_groupid_table.saveAsTextFile('/user/hadoop/result')
        break
    node_groupid_rdd.unpersist()
    del node_groupid_rdd
    node_groupid_rdd = new_node_groupid_table
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值