计算最大的关系网络的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
    

你可能感兴趣的:(大数据技术,数据分析挖掘,算法实践)