【问题标题】:Accessing edge attributes from a tuple in GraphX从 GraphX 中的元组访问边缘属性
【发布时间】:2020-03-03 05:58:30
【问题描述】:

我的图表还有一个问题。我的边包含三个属性作为元组,所以边看起来像

(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))

来自数据框df,其中包含作为第 0、1、2 列的属性和作为第 3 和第 4 列的顶点。

【问题讨论】:

    标签: apache-spark graph


    【解决方案1】:

    子图函数可以接受顶点和边谓词。对于边缘谓词,它需要一个接受 EdgeTriplet 对象并输出布尔值的函数。 EdgeTriple 对象的属性可以让您访问有关两个顶点的信息以及您创建的链接的属性。要实施您的案例,请尝试以下操作:

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

    这里是 EdgeTriple 的文档,它向您展示了您可以使用哪些属性:

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

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

    编辑:作为参考,这是一个完整的独立示例:

    import org.apache.spark._
    import org.apache.spark.graphx._
    import org.apache.spark.rdd.RDD
    import scala.util.hashing.MurmurHash3
    
    val data = Seq(
        (10, 11, 12, 1, 2),
        (10, 11, 13, 1, 3),
        (10, 11, 14, 1, 4),
        (10, 11, 15, 2, 3),
        (10, 11, 16, 2, 4)
    )
    
    val df = sc.parallelize(data).toDF
    
    
    val ed = df.rdd.
                map(x =>((MurmurHash3.stringHash(x.getString(3)), MurmurHash3.stringHash(x.getString(4))), (x.getInt(0), x.getInt(1), x.getInt(2)))).
                map(x => Edge(x._1._1, x._1._2, x._2))
    
    val graph = Graph.fromEdges(ed, 0)
    
    graph.subgraph( epred=(triplet) => triplet.attr._3 > 5)
    

    【讨论】:

    • 谢谢!不幸的是,它也不起作用,我收到错误消息 :46: error: constructor cannot be instantiated to expected type;找到:(T1,T2,T3)需要:org.apache.spark.graphx.EdgeTriplet[String,(Any, Any, Any)]
    • 现在我有 :46: error: value > is not a member of Any 我想我必须以不同的方式定义边缘。 :(
    • 我添加了我用来测试的完整示例代码。这显示了我如何定义边缘。和你做的一样吗?
    • 不完全是,我必须从数据框中定义它们,我是如何做到的,在上面的原始问题中有所描述。
    • 图形构建的问题是,当您使用数组索引访问 DF 行中使用的 Row 对象时,它返回 Any 类型。有一些特定的方法可以检索正确的类型。再次更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多