graphframes filterEdges比直接在spark数据帧上过滤快吗?

2024-05-16 03:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python graphframes在一个大数据集上执行计算。本质上,我将数据帧转换成一个图,其中每个顶点是数据帧中的一行,每个边表示我要执行的计算。这些计算是基于顶点的,使用目标/给定顶点的每个传出边的计数进行计算

例如,要确定给定v1-[e]->v2(其中v1表示我正在执行此计算的目标行,[e]表示计算类型,v2表示我可能包含在此计算中的潜在行)的某个计算,我通过对初始数据帧中的行值应用一些过滤器来确定是否要使用v2。如果v2与计算条件不匹配,我将从v1中删除边

大致上这看起来像:

def filter_graph(graph):
    calculations = ['calc1', 'calc2']
    df = None
    for c in calculations:
        sub_graph = graph.filterVertices('calculation = c').filterEdges('calculation = c')
        df = sub_graph
                .find("(a)-[ab]->(b)")
                .filter("""
                    b.some_attr = a.some_attr ...
                """)
    return df

但是,如果我将行数据从v1/av2/b卸载到边缘并使用本机graphframes函数filterEdges,这种计算会更快吗?这可能吗

比如:

def filter_graph_opt(graph):
    calculations = ['calc1', 'calc2']
    df = None
    for c in calculations:
        sub_graph = graph \
                     .filterVertices('calculation = c') \
                     .filterEdges('calculation = c') \
                     .filterEdges("""
                         dst.some_attr = src.some_attr
                     """)
    return df

Tags: 数据目标dfdefsomefilterv2graph