0

私は都市の友人のために接続されたコンポーネントを見つけようとしています。私のデータは、都市の属性を持つエッジのリストです。pysparkの接続されたコンポーネントを効率的に計算する

都市| SRC | DEST

ヒューストンカイル - >ベニー

ヒューストンベニー - >チャールズ

ヒューストンチャールズ - >デニー

オマハキャロル - >ブライアン

など

私が知っていますpysparkのGraphXライブラリのconnectedComponents関数は、グラフのすべてのエッジを繰り返して、接続されたコンポーネントを見つけ出し、避けたい それ。どうすればいい?

編集: 私はconnected_componentsは、項目のリストを生成し、データフレーム GROUPBY市

から

選択connected_components(*)のような何かができると思いました。

+0

は二度同じ質問を避け連結成分アルゴリズムを実行します。https://stackoverflow.com/questions/46386182/how-would -i-phrase-this-python-code-in-pyspark-sql-or-sql – Mariusz

+0

古いものを削除しましたが、これはより良いフレーズを持っています。 – oliver

答えて

1

、あなたのデータは、この

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") 

のように今の都市のリスト内のすべての都市の都市の列にフィルタを実行して、あなたが接続されているコンポーネント cities = List("Houston","Omaha")

を実行する対象の都市のリストを作成していると仮定結果のデータフレームからエッジと頂点のデータフレームを作成します。これらのエッジから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