如何编写转换函数来参考Graphframe对象来转换RDD?

时间:2016-07-04 13:53:48

标签: apache-spark pyspark rdd graphframes

我有一个Graphframe对象:g和一个RDD对象:候选人:

g = GraphFrame(v,e)
candidates_rdd.collect() 
#  [Row(source=u'a', target=u'b'),
#   Row(source=u'a', target=u'c'),
#   Row(source=u'e', target=u'a')]

我想在candidates_rdd中计算从“source”到“target”的路径,并使用graphframe的广度优先搜索生成带有键,值对((源,目标),path_list)的结果rdd,其中path_list是一个列表从源到目标的路径。

示例输出:

(('a','b'),['a-c-b','a-d-e-b']), 
(('f','c'),[]),
(('a',d'),['a-b-e-d']

我写了以下函数:

def bfs_(row):    
    arg1 = "id = '" + row.source + "'"
    arg2 = "id = '" + row.target + "'"        
    return ((row.source, row.target), g.bfs(arg1,arg2).rdd)

results = candidates_rdd.map(bfs_)

我收到了这个错误:

Py4JError: An error occurred while calling o274.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist

我试图将图表全局化或广播它,但都不起作用。

有人可以帮我这个吗?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

TL; DR这是不可能的。

Spark不支持这样的嵌套操作。外循环必须不分配:

>>> [g.bfs(arg1, arg2) for arg1, arg2 in candidates_rdd.collect()]