Hadoop 火花图平方邻接矩阵的示例代码

Hadoop 火花图平方邻接矩阵的示例代码,hadoop,mapreduce,graph-theory,apache-spark,Hadoop,Mapreduce,Graph Theory,Apache Spark,我有一个二部图,我想将其投影到2个新图上(例如,使用演员和电影的互联网电影数据库中的网络,投影出演员网络和电影网络,其权重对应于共同的电影(演员)数量) 在正则矩阵表示法中,只需将邻接矩阵平方,忽略对角线(等于原始图的出度)。对于大型稀疏图,可能有更快的基于边的算法,这就是为什么我对在Hadoop和Map Reduce框架中使用Spark/GraphX感兴趣的原因 那么,如何在Spark GraphX中进行A^2计算呢 假设我从以下代码开始: import org.apache.spark.gr

我有一个二部图,我想将其投影到2个新图上(例如,使用演员和电影的互联网电影数据库中的网络,投影出演员网络和电影网络,其权重对应于共同的电影(演员)数量)

在正则矩阵表示法中,只需将邻接矩阵平方,忽略对角线(等于原始图的出度)。对于大型稀疏图,可能有更快的基于边的算法,这就是为什么我对在Hadoop和Map Reduce框架中使用Spark/GraphX感兴趣的原因

那么,如何在Spark GraphX中进行A^2计算呢

假设我从以下代码开始:

import org.apache.spark.graphx._ 
val orig_graph = GraphLoader.edgeListFile(sc, "bipartite_network.dat") 
我看到的所有函数都是顶点上的连接、边上的连接或顶点属性或边属性的贴图。如何双重循环所有边,并使用基于顶点ID的边创建一个新的图

下面是一些伪代码:

for i = 1 to orig_graph.edges.count 
   for j = i to orig_graph.edges.count 
      var edge1 = orig_graph.edges.[i] 
      var edge2 = orig_graph.edges.[j] 
      if edge1.1 == edge2.1 then add new edge = (edge1.2, edge2.2) 
      if edge1.1 == edge2.2 then add new edge = (edge1.2, edge2.1) 
      if edge1.2 == edge2.1 then add new edge = (edge1.1, edge2.2) 
      if edge1.2 == edge2.2 then add new edge = (edge1.1, edge2.1) 
差不多吧

我需要使用Pregel和消息传递,还是只需要使用各种graph.join函数


另请参见

这里的算法基于:让我们调用链接的边权重(i,j)=Aij=Bij。我想写一个发出{(I,j),('a',j,Aij)}和发出{(j,k),('B',j,Bjk)}的映射函数,然后写一个reduce函数,对于所有(I,k)对,将Aij*Bjk和j=Pik相加,并发出{(I,k),Pik}。这将是我的新边列表和要输出的权重。暂时忘记那个算法是否有效。。。我的问题是如何使用graphx类在Scala中编写.map和.reduce函数并执行?好的,我已经解决了更多问题。。。调用此函数会遍历列表,但只在末尾返回一条边。救命啊!为什么没有返回所有的边?orig_graph.edges.map(ED=>Edge(ED.srcId,ED.dstId,ED.attr)).reduce((A,B)=>Edge(A.srcId,B.dstId,A.attr*B.attr))