PySpark GraphFrames查找Motifs返回空结果,求助排查问题
问题分析与解决方案
嘿,我看到你遇到的问题了——明明确定顶点和边有关联,但motifs查询全是空结果。仔细看了你的代码和GraphFrame的结构输出,问题出在数据类型不匹配上!
核心问题:顶点ID与边的src/dst类型不一致
从你打印的GraphFrame信息可以看到:
- 顶点表(v)的
id字段是int类型 - 边表(e)的
src和dst字段是string类型
GraphFrame在查找motifs时,会通过顶点的id和边的src/dst做关联匹配,而SQL的关联逻辑是严格匹配数据类型的——字符串和整数无法匹配,自然查不到任何关联结果。
解决方案:统一数据类型
你需要把边表的src和dst字段转换成和顶点id一致的int类型。修改你的代码如下:
#Renaming the id columns to enable GraphFrame verticesRDD = verticesRDD.withColumnRenamed("station_ID", "id") edgesRDD = edgesRDD.withColumnRenamed("Trip ID", "id") edgesRDD = edgesRDD.withColumnRenamed("Start Station", "src") edgesRDD = edgesRDD.withColumnRenamed("End Station", "dst") # 新增:将src和dst转换为int类型,与顶点id类型匹配 edgesRDD = edgesRDD.withColumn("src", edgesRDD["src"].cast("int")) edgesRDD = edgesRDD.withColumn("dst", edgesRDD["dst"].cast("int"))
验证步骤
修改后建议先确认类型是否一致:
verticesRDD.printSchema() edgesRDD.printSchema()
确保顶点的id和边的src、dst都是int类型。
之后重新创建GraphFrame并运行motifs查询:
g = GraphFrame(verticesRDD, edgesRDD) motifs = g.find("(a)-[e1]->(b)") motifs.show()
这时候应该就能得到预期的关联结果了。
内容的提问来源于stack exchange,提问作者vikram
相关产品推荐
相关产品推荐

