如何解决如何从 Pyspark 中的火花数据框创建边列表?
我在 pyspark 中使用 graphframes
进行某种图形类型的分析,想知道从顶点数据框创建边列表数据框的最佳方法是什么。
例如,下面是我的顶点数据框。我有一个 ID 列表,它们属于不同的组。
+---+-----+
|id |group|
+---+-----+
|a |1 |
|b |2 |
|c |1 |
|d |2 |
|e |3 |
|a |3 |
|f |1 |
+---+-----+
我的目标是创建一个边缘列表数据框来指示出现在公共组中的 id。 请注意,1 个 id 可能出现在多个组中(例如,上面的 id 位于组 1 和组 3 中)。 以下是我想要获取的边缘列表数据框:
+---+-----+-----+
|src|dst |group|
+---+-----+-----+
|a |c |1 |
|a |f |1 |
|c |f |1 |
|b |d |2 |
|a |e |3 |
+---+-----+-----+
提前致谢!
解决方法
编辑 1
不确定这是否是更好的解决方法,但我做了一个解决方法:
import pyspark.sql.functions as f
df = df.withColumn('match',f.collect_set('id').over(Window.partitionBy('group')))
df = df.select(f.col('id').alias('src'),f.explode('match').alias('dst'),f.col('group'))
df = df.withColumn('duplicate_edges',f.array_sort(f.array('src','dst')))
df = (df
.where(f.col('src') != f.col('dst'))
.drop_duplicates(subset=['duplicate_edges'])
.drop('duplicate_edges'))
df.sort('group','src','dst').show()
输出
+---+---+-----+
|src|dst|group|
+---+---+-----+
| a| c| 1|
| a| f| 1|
| c| f| 1|
| b| d| 2|
| e| a| 3|
+---+---+-----+
原答案
试试这个:
import pyspark.sql.functions as f
df = (df
.groupby('group')
.agg(f.first('id').alias('src'),f.last('id').alias('dst')))
df.show()
输出:
+-----+---+---+
|group|src|dst|
+-----+---+---+
| 1| a| c|
| 3| e| a|
| 2| b| d|
+-----+---+---+
,
您可以进行自连接:
df = df.toDF('src','group')
df2 = df.toDF('dst','group2')
result = df.join(
df2,(df.group == df2.group2) & (df.src < df2.dst)
).select('src','dst','group').distinct().orderBy('group','dst')
result.show()
+---+---+-----+
|src|dst|group|
+---+---+-----+
| a| c| 1|
| a| f| 1|
| c| f| 1|
| b| d| 2|
| a| e| 3|
+---+---+-----+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。