【问题标题】:Spark GraphX: add multiple edge weightsSpark GraphX:添加多个边权重
【发布时间】:2017-10-11 04:56:16
【问题描述】:

我是 GraphX 的新手,并且有一个包含如下四列的 Spark 数据框:

src_ip    dst_ip    flow_count   sum_bytes
8.8.8.8   1.2.3.4          435        1137
  ...       ...           ...         ...

基本上我想将src_ipdst_ip 都映射到顶点并将flow_countsum_bytes 分配为边属性。据我所知,我们不能在 GraphX 中添加边属性,因为只允许顶点属性。因此,我正在考虑将flow_count 添加为边缘权重:

//create edges
val trafficEdges = trafficsFromTo.map(x =Edge(MurmurHash3.stringHash(x(0).toString,MurmurHash3.stringHash(x(1).toString,x(2))

但是,我可以添加sum_bytes 作为边权重吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-graphx


    【解决方案1】:

    可以将两个变量都添加到边缘。最简单的解决方案是使用元组,例如:

    val data = Array(Edge(3L, 7L, (123, 456)), Edge(5L, 3L, (41, 34)))
    val edges: RDD[Edge[(Int, Int)]] = spark.sparkContext.parallelize(data)
    

    或者,您可以使用案例类:

    case class EdgeWeight(flow_count: Int, sum_bytes: Int)
    
    val data2 = Array(Edge(3L, 7L, EdgeWeight(123, 456)), Edge(5L, 3L, EdgeWeight(41, 34)))
    val edges: RDD[Edge[EdgeWeight]] = spark.sparkContext.parallelize(data2)
    

    如果要添加更多的属性,使用案例类会更方便使用和维护。


    我相信在这种特定情况下,最优雅的解决方法是:

    val trafficEdges = trafficsFromTo.map{x => 
      Edge(MurmurHash3.stringHash(x(0).toString, 
           MurmurHash3.stringHash(x(1).toString,
           EdgeWeight(x(2), x(3))
    }
    
    trafficEdges.sortBy(edge => edge.attr.flow_count) // sort by flow_count
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2011-12-22
      相关资源
      最近更新 更多