SparkGraphX构建图
GraphX的Graph对象是用户操作图的入口。它包含了顶点(vertices)、边(edges)以及triplets三部分,并且这三部分都包含相应的属性,可以携带额外的信息。可以根据边以及边的两个顶点构建图。
SparkGraphX构建图:两种方法、三个步骤
一、SparkGraphX构建图的两种方法
方法一:根据边构建图
根据边构建图Graph.fromEdges
def fromEdges[VD: ClassTag, ED: ClassTag](
edges: RDD[Edge[ED]],
defaultValue: VD,
edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY): Graph[VD, ED] = {
GraphImpl(edges, defaultValue, edgeStorageLevel, vertexStorageLevel)
}
方法二:根据边的两个顶点数据构建图
根据边的两个顶点数据构建(Graph.fromEdgeTuples)
def fromEdgeTuples[VD: ClassTag](
rawEdges: RDD[(VertexId, VertexId)],
defaultValue: VD,
uniqueEdges: Option[PartitionStrategy] = None,
edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY): Graph[VD, Int] =
{
val edges = rawEdges.map(p => Edge(p._1, p._2, 1))
val graph = GraphImpl(edges, defaultValue, edgeStorageLevel, vertexStorageLevel)
uniqueEdges match {
case Some(p) => graph.partitionBy(p).groupEdges((a, b) => a + b)
case None => graph
}
}
从上面的代码我们知道,不管是根据边构建图还是根据边的两个顶点数据构建,最终都是使用GraphImpl来构建的,即调用了GraphImpl的apply方法。
接下来,继续分析构建图的过程:
构建图的过程很简单,分为三步,它们分别是构建边EdgeRDD、构建顶点VertexRDD、生成Graph对象。下面分别介绍这三个步骤。
二、SparkGraphX构建图的三个步骤
第一步:构建边EdgeRDD
建边EdgeRDD也分为三步,下面举例详细说明了这些步骤。
①从文件中加载信息,转换成tuple的形式,即(srcId, dstId)
val rawEdgesRdd: RDD[(Long, Long)] =
sc.textFile(input).filter(s => s != "0,0").repartition(partitionNum).map {
case line =>
val ss = line.split(",")
val src = ss(0).toLong
val dst = ss(1).toLong
if (src < dst)
(src, dst)
else
(dst, src)
}.distinct()
②入口,调用Graph.fromEdgeTuples(rawEdgesRdd)
源数据为分割的两个点ID,把源数据映射成Edge(srcId,dstId,attr)对象; attr默认为1。这样元数据就构建成了RDD[Edge[ED]],如下面的代码
val edges = rawEdgesRdd.map(p => Edge(p._1, p._2, 1))
③将RDD[Edge[ED]]进一步转化成EdgeRDDImpl[ED, VD]
第二步构建完RDD[Edge[ED]]之后,GraphX通过调用GraphImpl的apply方法来构建Graph。
val graph = GraphImpl(edges, defaultValue, edgeStorageLevel, vertexStorageLevel)
def apply[VD: ClassTag