有效计算pyspark中的连接组件
efficiently calculating connected components in pyspark
我正在尝试为城市中的朋友查找连接的组件。我的数据是具有 city 属性的边列表。
城市 |资源中心 |目标
休斯顿凯尔 -> 本尼
休斯顿本尼 -> 查尔斯
休斯顿查尔斯 -> 丹尼
奥马哈卡罗尔 -> 布赖恩
等
我知道 pyspark 的 GraphX 库的 connectedComponents 函数将遍历图形的所有边以找到连接的组件,我想避免这种情况。我该怎么做?
编辑:
我以为我可以做类似
的事情
select connected_components(*) 来自数据框
按城市分组
其中 connected_components 生成项目列表。
假设你的数据是这样的
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")
现在 运行 为城市列表中的每个城市过滤城市列,然后从生成的数据框中创建边和顶点数据框。从这些边和顶点数据框和 运行 连通分量算法
创建一个图框
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|
+------+------------+
我正在尝试为城市中的朋友查找连接的组件。我的数据是具有 city 属性的边列表。
城市 |资源中心 |目标
休斯顿凯尔 -> 本尼
休斯顿本尼 -> 查尔斯
休斯顿查尔斯 -> 丹尼
奥马哈卡罗尔 -> 布赖恩
等
我知道 pyspark 的 GraphX 库的 connectedComponents 函数将遍历图形的所有边以找到连接的组件,我想避免这种情况。我该怎么做?
编辑: 我以为我可以做类似
的事情select connected_components(*) 来自数据框 按城市分组
其中 connected_components 生成项目列表。
假设你的数据是这样的
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")
现在 运行 为城市列表中的每个城市过滤城市列,然后从生成的数据框中创建边和顶点数据框。从这些边和顶点数据框和 运行 连通分量算法
创建一个图框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|
+------+------------+