2017-02-27 2 views
1

연결된 그래프를 내 데이터 집합에서 실행하려고합니다. 방향 그래프를 사용하고 있습니다. 연결된 구성 요소가 가장자리의 양쪽 방향으로 횡 방향 이동하는 것을 원하지 않습니다.Spark Graphx 또는 Graphframe을 사용하여 방향성 그래프를 만드는 방법

이 내 샘플 코드

import org.apache.log4j.{Level, LogManager} 
import org.apache.spark.SparkConf 
import org.apache.spark.graphx.Edge 
import org.apache.spark.sql._ 
import org.graphframes._ 

object CCTest { 

def main(args: Array[String]) { 

    val sparkConf = new SparkConf() 
     .setMaster("local[2]") 
    .setAppName("cc_test") 


    implicit val sparkSession = SparkSession.builder().config(sparkConf).getOrCreate() 

    val sc = sparkSession.sparkContext 

    val vertex = sparkSession.createDataFrame(sc.parallelize(Array(
    (1L, "b4fcde907cbd290b7e16", 28), 
    (2L, "cda389612d6b37674cb1", 27), 
    (3L, "1a6a6e3fd2daaeeb2a05", 65), 
    (4L, "9a007eee210a47e58047", 42), 
    (5L, "e91898d39bf5f8501827", 55), 
    (6L, "ceab58c59d23549d3f4b", 50), 
    (12L, "ceab58c59asd3549d3f4b", 50), 
    (14L, "ceab508c59d23549d3f4b", 55), 
    (15L, "ceab508c59d23541d3f4b", 51) 
))).toDF("id", "similar_hash", "size") 

    val edges = sparkSession.createDataFrame(sc.parallelize(Array(
      Edge(2L, 1L, 0.7f), 
      Edge(2L, 4L, 0.2f), 
      Edge(3L, 2L, 0.4f), 
      Edge(3L, 6L, 0.3f), 
      Edge(4L, 1L, 0.1f), 
      Edge(5L, 2L, 0.2f), 
      Edge(5L, 3L, 0.8f), 
      Edge(5L, 6L, 0.3f), 
      Edge(12L, 14L, 1.3f), 
      Edge(15L, 14L, 1.3f) //< - should not be connected except (14L, 15L) 
     ))).toDF("src", "dst", "attr") 


    val graph = GraphFrame(vertex, edges) 

    val cc = graph.connectedComponents.run() 

    cc.show() 



    sparkSession.stop() 

} 

} 

결과입니다 :

+---+--------------------+----+---------+ 
| id|  similar_hash|size|component| 
+---+--------------------+----+---------+ 
| 6|ceab58c59d23549d3f4b| 50|  1| 
| 5|e91898d39bf5f8501827| 55|  1| 
| 1|b4fcde907cbd290b7e16| 28|  1| 
| 3|1a6a6e3fd2daaeeb2a05| 65|  1| 
| 12|ceab58c59asd3549d...| 50|  12| 
| 2|cda389612d6b37674cb1| 27|  1| 
| 4|9a007eee210a47e58047| 42|  1| 
| 14|ceab508c59d23549d...| 55|  12| 
| 15|ceab508c59d23541d...| 51|  12| <- should be in separate cluster 
+---+--------------------+----+---------+ 

어떻게이 제발 달성 할 수 있습니까?

+1

['stronglyConnectedComponents'] (https://spark.apache.org/docs/latest/api/scala/index.html#[email protected] (numIter : Int) : org. apache.spark.graphx.Graph [org.apache.spark.graphx.VertexId, ED]). – zero323

+0

@ zero323 SCC를 사용할 수 없다고 생각합니다. (잘못된 것이면 수정하십시오.) 모든 노드에 다른 노드가 연결할 수 있어야하기 때문에 SCC를 사용할 수 있다고 생각하지 않습니다. 하지만 기본적으로 SQL 재귀 쿼리와 같은 재귀를 수행해야합니다. 예 : A -> B, B -> C, m -> B 강하게 CC : 집합 = {A, B}, 집합 = {B, C}, 집합 = {m, b} 연결된 구성 요소 : 'a -> b -> m'노드에 연결된 알림 및 'm'은 set ='{a, b, d, 그러나 너무 재귀 A의 -> B -> C = {A, B, C} 및 m -> B = {m, B} 이 두 세트 {a, b, c}와 {m, b} –

+0

OK. 그렇다면 {{a, b, c}, {{m, b, c}}가 아닌 {{a, b, c} 한 가지 방법이나 다른 방법으로 Pregel API가 필요합니다. – zero323

답변

0

내가 실수했을 수도 있지만 내 솔루션은 source codeconnectedComponents에서 직접 발생합니다. 라인 (54), 시스템 자체는이 당신을 위해 일할 수있는, (here를 찾을 수 있습니다) 단순히 더 적당한 매개 변수에 EdgeDirection을 변경하여

val pregelGraph = Pregel(ccGraph, initialMessage, maxIterations,EdgeDirection.Either)

되는 키 라인, 프레 겔 반복자를 호출합니다.

관련 문제