如何基于 属性 在 RDD[(Long, Vertex)] 中的顶点之间创建链接?
How to create links between vertices in RDD[(Long, Vertex)] based on a property?
我有一个用户:RDD[(Long, Vertex)]
用户集合。我想在我的 Vertex 对象之间创建 links。规则是:如果两个顶点在选定的 属性 中具有相同的值 - 将其称为 prop1,则存在 link。
我的问题是如何检查同一集合中的每一对。如果我这样做:
val rels = users.map(
x => users.map(y => if(x._2.prop1 == y._2.prop1){(x._1, y._1)}))
我得到了一个 RDD[RDD[Any]]
而不是 Graph 正常工作所期望的 RDD[(Long, Long)]
首先,您不能从另一个动作或转换开始转换动作,更不用说创建嵌套 RDDs
。所以你根本不可能得到RDD[RDD[Any]]
。
你在这里需要的很可能是一个简单的连接,大致相当于这样的东西,其中 T
是 property1
:
的一种类型
val pairs: RDD[(T, Long)] = users.map{ case (id, v) => (v.prop1, id) }
val links: RDD[(Long, Long)] = pairs
.join(pairs) // join by a common property, equivalent to INNER JOIN in SQL
.values // drop properties
.filter{ case (v1, v2) => v1 != v2 } // filter self-links
我有一个用户:RDD[(Long, Vertex)]
用户集合。我想在我的 Vertex 对象之间创建 links。规则是:如果两个顶点在选定的 属性 中具有相同的值 - 将其称为 prop1,则存在 link。
我的问题是如何检查同一集合中的每一对。如果我这样做:
val rels = users.map(
x => users.map(y => if(x._2.prop1 == y._2.prop1){(x._1, y._1)}))
我得到了一个 RDD[RDD[Any]]
而不是 Graph 正常工作所期望的 RDD[(Long, Long)]
首先,您不能从另一个动作或转换开始转换动作,更不用说创建嵌套 RDDs
。所以你根本不可能得到RDD[RDD[Any]]
。
你在这里需要的很可能是一个简单的连接,大致相当于这样的东西,其中 T
是 property1
:
val pairs: RDD[(T, Long)] = users.map{ case (id, v) => (v.prop1, id) }
val links: RDD[(Long, Long)] = pairs
.join(pairs) // join by a common property, equivalent to INNER JOIN in SQL
.values // drop properties
.filter{ case (v1, v2) => v1 != v2 } // filter self-links