GraphFrame BFS查询返回非指定起点路径的原因咨询
GraphFrame BFS返回非指定起点路径问题原因及解决方案
问题原因
你的问题核心出在fromExpr的表达式写法存在类型隐式转换问题:
- 你的id字段是字符串类型,但你写的
fromExpr("id = 153030152492013800151")中,右侧的id值没有加引号,会被Spark SQL识别为数值类型,执行时会自动把id字段的字符串值转换为数值做对比。 - 你使用的id长度为21位,远超过64位长整型的最大值(9223372036854775807,共19位),转换为数值时会发生精度丢失,导致
153030152492013800151和153030152492013801220两个不同的字符串转换后得到相同的数值,因此fromExpr把两个节点都判定为符合条件的起点,最终返回了两条不相关的路径。
解决方案
- 修正BFS表达式,给id值加单引号声明为字符串类型,避免类型隐式转换,修改后的语句如下:
g.bfs.fromExpr("id = '153030152492013800151'").toExpr("parent = ''").run().show(false)
- 如果你的核心需求是查找所有总根节点,不需要构建图执行BFS,直接执行
df.filter("parent = ''").show()即可,性能更高。 - 如果需要批量计算所有节点对应的总根节点,更推荐使用GraphFrame的Pregel API实现,灵活度和性能都优于BFS。
内容的提问来源于stack exchange,提问作者Vitor Ferreira
相关产品推荐
相关产品推荐

