0

도시의 친구들을 위해 연결된 구성 요소를 찾으려고합니다. 내 데이터는 도시 속성으로 가장자리 목록입니다.pyspark에서 연결된 구성 요소를 효율적으로 계산합니다.

시 | SRC | DEST

휴스턴 카일 -> 베니

휴스턴 베니 -> 찰스

휴스턴 찰스 -> 데니

오마하 캐롤 -> 브라이언

내가 아는 pyspark의 GraphX ​​라이브러리의 connectedComponents 함수는 연결된 모든 구성 요소를 찾기 위해 그래프의 모든 가장자리를 반복하며 피하고 싶습니다. 그거. 내가 어떻게 그럴 수 있니?

편집 : 은 내가 dataframe GROUPBY 도시 connected_components 항목의 목록을 생성

에서

선택 connected_components (*) 같은 것을 할 수 있다고 생각.

+0

마십시오 두 번 같은 질문을 : https://stackoverflow.com/questions/46386182/how-would -i-phrase-this-python-code-in-pyspark-sql-or-sql – Mariusz

+0

이전 버전을 삭제했습니다.이 버전은 더 나은 표현이 있습니다. – oliver

답변

1

데이터를 가정하면 연결 구성 요소 cities = List("Houston","Omaha")

이제 도시 목록에있는 모든 도시를위한 도시 열에 필터를 실행 를 실행하고자하는 도시의 목록을 작성이

import org.apache.spark._ 
import org.graphframes._ 

val l = List(("Houston","Kyle","Benny"),("Houston","Benny","charles"), 
      ("Houston","Charles","Denny"),("Omaha","carol","Brian"), 
      ("Omaha","Brian","Daniel"),("Omaha","Sara","Marry")) 
var df = spark.createDataFrame(l).toDF("city","src","dst") 

처럼, 그런 다음 결과 데이터 프레임에서 에지 및 정점 데이터 프레임을 생성합니다. 연결 구성 요소 알고리즘을이 가장자리와 정점 dataframes에서 graphframe을 만들고 실행

val cities = List("Houston","Omaha") 

for(city <- cities){ 
    val edges = df.filter(df("city") === city).drop("city") 
    val vert = edges.select("src").union(edges.select("dst")). 
        distinct.select(col("src").alias("id")) 
    val g = GraphFrame(vert,edges) 
    val res = g.connectedComponents.run() 
    res.select("id", "component").orderBy("component").show() 
} 

출력

|  id| component| 
+-------+------------+ 
| Kyle|249108103168| 
|charles|249108103168| 
| Benny|249108103168| 
|Charles|721554505728| 
| Denny|721554505728| 
+-------+------------+ 

+------+------------+               
| id| component| 
+------+------------+ 
| Marry|858993459200| 
| Sara|858993459200| 
| Brian|944892805120| 
| carol|944892805120| 
|Daniel|944892805120| 
+------+------------+ 
+0

작업 해 주셔서 감사합니다. 그리고 괜찮습니다. 내가 차단하고 싶었던 값을 반복하는 것보다 금속에 조금 더 가까운 것이있을 것이라고 생각했지만 여전히 답변에 감사드립니다. – oliver