我是GraphX的新手,拥有一个包含四列的Spark数据框,如下所示:
src_ip dst_ip flow_count sum_bytes
8.8.8.8 1.2.3.4 435 1137
... ... ... ...
基本上我想将src_ip
和dst_ip
映射到顶点,并将flow_count
和sum_bytes
指定为edge属性。据我所知,我们不能在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
作为边缘权重吗?
答案 0 :(得分:2)
可以将两个变量都添加到边缘。最简单的解决方案是使用元组,例如:
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