使用Graphx

时间:2015-07-04 06:27:32

标签: scala apache-spark spark-graphx

在无向图中的一个集团,G =(V,E)是顶点的子集,C⊆V,使得每两个不同的顶点是相邻的。这相当于C引起的G子图完成的条件。在某些情况下,术语clique也可以直接引用子图。

所以,我正在使用GraphX和Apache-Spark。我阅读了它的文档指南,它们提供了一种在图表中查找连接组件的方法,但没有提供派系/强连接组件。我怎么能用Scala做到这一点?谢谢!

编辑:正如评论中所建议的那样,我在R中为执行相同任务而编写的一段代码如下:(与Spark一起使用此代码的问题是最近发布的SparkR,通过它我可以使用R Spark在库方面的支持有限(例如,igraph)。因此,我开始使用GraphX和Scala),我现在需要算法。

library(igraph)
files <- paste0("NP",1:10,".txt") // Files which represent graphs
func.clique <- function(file)
{
    w <- read.table(file)
    g <- graph.edgelist(cbind(as.character(w$V1),as.character(w$V2)))
    plot(g)
    cli <- cliques(g)
    return (cli)
}
cliquevalues <- sapply(files,func.clique)

1 个答案:

答案 0 :(得分:2)

我们最近使用了jgrapht,与上面@marios在评论中提到的相同。关于如何使用它的示例代码,此处Vertex是自定义Vertex类,cliques为您提供图表中存在的所有派系的列表:

import org.jgrapht._
import org.jgrapht.graph._
import org.jgrapht.alg._
import scala.collection.JavaConverters._
import Util._
import Constants._
import Implicits._

class CliqueGraph(vertices:List[Vertex],xyEdges:List[(Vertex,Vertex)]){
    val graph = new SimpleGraph[Vertex, DefaultEdge](classOf[DefaultEdge])
    vertices.foreach(v=>graph.addVertex(v))
    xyEdges.foreach{ case(v1,v2) =>
            graphg.addEdge(v1,v2)
    }
    lazy val cliques= {
        val c =  new BronKerboschCliqueFinder(graph)
        val setVertices = c.getAllMaximalCliques().asScala
        setVertices.toList
    }
}

在build.sbt文件中,您需要导入库:

libraryDependencies += "org.jgrapht" % "jgrapht-dist" % "0.9.0"