问题描述
> |Id1 |Id2 |attr1 |attr2 |attr3|
> ----:----:------:------:-----:
> |1 |2 |1 |0 |.5 |
> |1 |3 |1 |1 |.33 |
> |2 |3 |0 |.6 |.7 |
我想用表中值的权重为非零属性创建边? 我该怎么做?我似乎找不到任何简单的方法,所以现在我只是使用 for 循环并遍历每一行,但这似乎效率低下。谢谢!
解决方法
三个属性列可以是stacked。在过滤非零值的结果列后,可以构造一个没有边为零的 GraphFrame:
df = ...
edges = df.withColumn("weight",F.expr("stack(3,cast(attr1 as double),cast(attr2 as double),cast(attr3 as double))"))\
.drop("attr1","attr2","attr3") \
.filter("weight <> 0.0") \
.withColumnRenamed("Id1","src") \
.withColumnRenamed("Id2","dst")
vertices = edges.selectExpr("src as id").union(edges.selectExpr("dst as id")).distinct()
from graphframes import GraphFrame
g = GraphFrame(vertices,edges)
作为测试,可以检查每个顶点的入度:
g.inDegrees.show()
印刷品
+---+--------+
| id|inDegree|
+---+--------+
| 3| 5|
| 2| 2|
+---+--------+
此结果与给定数据一致:顶点 2
具有来自示例数据第一行的两条传入边,顶点 3
具有来自第二条数据行的三个传入边和来自示例数据的两条边第三行。