【问题标题】:Spark Scala GraphX: Creating a Weighted Directed GraphSpark Scala GraphX:创建加权有向图
【发布时间】:2016-05-06 07:26:03
【问题描述】:

我有一个数据框 dfMaster,它有三列,vertex1,vertex2,weight。我正在尝试创建一个 GraphX 有向加权图,该图具有来自 V1 和 V2 的顶点以及它们之间具有相应权重的边。我可以通过以下方式创建边缘和顶点df:

val edgeDF = dfMaster.select($"vertex1", $"vertex2", $"weight").distinct()
val vertexDF = (dfMaster.select("vertex1").toDF().unionAll(DFMaster.select("vertex2").toDF())).distinct()

然后如何将其加载到加权图中?感谢您的帮助。

【问题讨论】:

    标签: scala apache-spark spark-graphx


    【解决方案1】:

    据我所知,Spark GraphX 目前仅支持从 RDD 创建。可用于创建图形的主要方法可以在以下类中找到:

    对于您的情况,我建议使用以下代码:

    import org.apache.spark.sql.Row
    import org.apache.spark.graphx.{Graph, Edge}
    
    val edgeDF = dfMaster.select($"vertex1", $"vertex2", $"weight").distinct()
    
    val edgeRDD = edgeDF.map { 
      case Row(srcId: Double, dstId: Double, wgt: Double) => Edge[Double](srcId.toLong, dstId.toLong, wgt)
    }
    
    val graph = Graph.fromEdges[Int, Double](edgesRDD, 0)   
    

    上面的fromEdges 方法从边推断顶点并将0 设置为它们的属性。

    假设:

    • vertex1vertex2weightDouble 的列;
    • 顶点没有属性信息,全部用0创建就可以了。

    【讨论】:

    • 您好,感谢您的帮助。 vertex1、vertex2、vertex3 的类型都是双精度的。我继续修改您的代码并将其更改为双打。但是,当我运行 edgeRDD 行时,在 Edge[Double](srcId, dstId, wgt) 出现三个错误,并显示错误消息: type mismatch, found Double, required org.apache.spark.graphx.VertexId 。你知道这意味着什么吗?
    • 顶点 id 必须是 Long 类型(或 VertexId,它是 Long 的子类型)
    • 如果您无法通过转换为 Long 来获得顶点的唯一值,恐怕您将不得不使用 zipWithUniqueId 之类的东西。请让我知道toLong 是否足以满足您的需求。
    • 嘿,再次感谢您的帮助。澄清一下,这只会创建从顶点 1 到顶点 2 的边,对吧?不是双向的吗?我问的原因是,当我尝试通过以下方式获取图中没有入度的顶点时: val Trees = inviteGraph.inDegrees.filter { case (id, indegree) => indegree == 0 }我拿 5 打印。当我设置它 == 1 时,我确实得到了节点。感谢您再次提供帮助。
    • 你是对的。这种方法使用映射到srcIdvertex1 和映射到dstIdvertex2 创建边。但是,如果我可以重复,我建议您确保在为双类型顶点调用 toLong 时没有插入错误的重复值。传递给Edge 的构造函数的每个long 值必须代表图中的一个特定顶点。
    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多