首页 > 解决方案 > 图框和 BFS

问题描述

我在理解 Graphframe 上的 BFS 时遇到了一些问题。我正在尝试获得“所有人之父”-图中没有父母的人。

看,我有这个数据框:

val df = sqlContext.createDataFrame(List(
  ("153030152492012801800", ""),
  ("153030152492012801845", ""),
  ("153030152492013801220","153030152492012801845"),
  ("153030152492013800151","153030152492012801845"),
  ("153030152492014800546","153030152492012801845"),
  ("153030152492013800497", "153030152492013800151"),
  ("153030152492013801860", "153030152492013800151"),
  ("153030152492014800038", "153030152492013801860"),
  ("153030152492014801015", "153030152492014800038"),
  ("153030152492014801235", "153030152492014801015")
  )).toDF("id", "parent")

我将我的图表构建为:

val df_vertices = df.selectExpr("id", "parent")
val df_edges = df.withColumnRenamed("id", "src").withColumnRenamed("parent", "dst").withColumn("relation", lit("parent"))
val g  = GraphFrame(df_vertices, df_edges)

最后,我将 BFS 运行为:

g.bfs.fromExpr("id = 153030152492013800151").toExpr("parent = ''").run().show(false)

但我得到了这个:

+----------------------------------------------+------------------------------------------------------+-------------------------+
|from                                          |e0                                                    |to                       |
+----------------------------------------------+------------------------------------------------------+-------------------------+
|[153030152492013801220, 153030152492012801845]|[153030152492013801220, 153030152492012801845, parent]|[153030152492012801845, ]|
|[153030152492013800151, 153030152492012801845]|[153030152492013800151, 153030152492012801845, parent]|[153030152492012801845, ]|
+----------------------------------------------+------------------------------------------------------+-------------------------+

问题是,为什么我得到第一行,以 "153030152492013801220" 开头的那一行?看,这个值不在“153030152492013800151”的路径中。那么,为什么会出现这个结果?

谢谢你们!

标签: scalaapache-sparkbreadth-first-searchgraphframes

解决方案


我发现了我的错误。问题是“ID”是一个字符串,所以,我不得不将 BFS 称为:

g.bfs.fromExpr("id = '153030152492013800151'").toExpr("parent = ''").run().show(false)

我发布了答案,因为 graphframe 没有显示任何错误。只是为了警告你。


推荐阅读