从GraphX中的元组访问边缘属性

时间:2018-05-03 12:09:46

标签: apache-spark graph

我的图表有另一个问题。我的边包含三个属性作为元组,因此边缘看起来像(verticeId_1, verticeId_2,(Attr1,Attr2,Attr3))。 我正在尝试创建一个仅包含边的图形,其中Attr2> 100(Attr2是一个数字)。所以我试试这个: val gr2=graph.subgraph(epred=(id1: String,id2: String, attr: Tuple) => attr(2)>100) 但是变成了错误元组不能在方法或函数参数中直接解构。这个问题有一些解决方法吗? 提前谢谢。

更新。边缘定义为 val ed = df.rdd.map(x =>((MurmurHash.stringHash(x(3).toString),MurmurHash.stringHash(x(4).toString)), (x(0),x(1),x(2)))).map(x => Edge(x._1._1, x._1._2,x._2)) 来自dataframe df,其中包含属性为列0,1,2,顶点为第3列和第4列。

1 个答案:

答案 0 :(得分:2)

子图函数可以采用顶点和边缘谓词。对于边缘谓词,它需要一个带有EdgeTriplet对象并输出布尔值的函数。 EdgeTriple对象具有一些属性,使您可以访问有关顶点和您创建的链接的属性的信息。要实现您的案例,请尝试以下方法:

ui->setupUi(this);
Filter * filter = new Filter();
ui->label->installEventFilter(filter);

/* don't forget to call: 

    delete filter;

  somewhere later */

以下是EdgeTriple的文档,其中显示了您可以使用的属性:

https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.graphx.EdgeTriplet

另外,请注意您的边缘属性是一个元组,因此必须使用" _1"," _2"等成员访问它们,而不是使用括号进行数组索引。

编辑:作为参考,这是一个完整的自包含示例:

g2 = graph.subgraph( epred=(triplet) => triplet.attr._3 > 100)