GraphX是否支持同一图表中的不同类型的顶点?

时间:2016-06-21 23:54:32

标签: spark-graphx

我想知道我可以使用不同类型的顶点建模GraphX图吗?说我有以下实体:产品,买家,卖家。我想形成一个图形结构,将这些实体作为顶点。 (例如:以图形方式显示卖方出售并由买方购买的产品。)是否可以使用GraphX,如果可以,如何? 谢谢!

1 个答案:

答案 0 :(得分:7)

当然。

使用id和一组属性表示顶点,这些属性可以在顶点之间有所不同。像这样:

val vertices=Array(
  ( 1L, ( "1 property" ) ),
  ( 2L, ( "2 properties", 2 ) ),
  ( 3L, ( "3 properties", 3, true ) )
)
val vRDD= spark.parallelize( vertices )
val edges = Array(Edge(1L,2L,1800),Edge(2L,3L,800),Edge(3L,1L,1400))
val eRDD= spark.parallelize( edges )

val graph = Graph( vRDD, eRDD )

graph.vertices.collect.foreach( println )

您可以使用每个顶点的第一个属性来表示它是什么类型的顶点。

或者您可以使用更正式的方法:

class VertexProperty()
case class DocumentProperty( val url:   String ) extends VertexProperty
case class UserProperty(     val name:  String ) extends VertexProperty
case class SentenceProperty( val index: Int    ) extends VertexProperty

val vertices = Array[ ( VertexId, VertexProperty) ] (
  ( 1L, DocumentProperty("www.bbc.co.uk") ),
  ( 2L, UserProperty("Sam") ),
  ( 3L, SentenceProperty( 1 ) )
)
val vRDD= spark.parallelize(vertices)

val edges = Array( Edge( 1L, 2L, 1800 ), Edge( 2L, 3L, 800 ), Edge( 3L, 1L, 1400 ) )
val eRDD= spark.parallelize(edges)

var graph: Graph[ VertexProperty, Int ] = Graph( vRDD, eRDD )

graph.vertices.collect.foreach {
  case ( id, DocumentProperty( url ) ) => println( s"$url" )
  case _ =>
}