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
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