我正在使用来自 Python 和 R 的 Spark/GraphFrames。当我在 Python 的小图上调用 PageRank 时,它比使用 R 慢很多。考虑到 Python 和 R 都在调用相同的图书馆?
我将尝试在下面演示这个问题。
Spark/GraphFrames 包括图的示例,例如朋友,如此链接中所述。这是一个非常小的有向图,有 6 个节点和 8 条边(请注意,该示例与其他版本的 GraphFrames 相比并不相同)。
当我用 R 运行以下代码时,几乎不需要时间来计算 PageRank:
library(graphframes)
library(sparklyr)
library(dplyr)
nodes <- read.csv('nodes.csv')
edges <- read.csv('edges.csv')
sc <- spark_connect(master = "local", version = "2.1.1")
nodes_tbl <- copy_to(sc, nodes)
edges_tbl <- copy_to(sc, edges)
graph <- gf_graphframe(nodes_tbl, edges_tbl)
ranks <- gf_pagerank(graph, reset_probability = 0.15, tol = 0.01)
print(ranks$vertices)
results <- as.data.frame(ranks$vertices)
results <- arrange(results, id)
results$pagerank <- results$pagerank / sum(results$pagerank)
print(results)
当我使用 PySpark 运行等效程序时,需要 10 到 30 分钟:
from pyspark.sql import SparkSession
from graphframes.examples import Graphs
if __name__ == '__main__':
sc = SparkSession.builder.master("local").getOrCreate()
g = Graphs(sc).friends()
results = g.pageRank(resetProbability=0.15, tol=0.01)
results.vertices.select("id", "pagerank").show()
results.edges.select("src", "dst", "weight").show()
我尝试了不同版本的 Spark 和 GraphFrames for Python 以与 R 的设置保持一致。