如何使用Long数据类型在Apache Spark GraphX中创建VertexId?

时间:2015-07-02 15:45:23

标签: scala apache-spark spark-graphx

我尝试使用一些Google Web Graph数据创建图表,可在此处找到:

https://snap.stanford.edu/data/web-Google.html

import org.apache.spark._
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD



val textFile = sc.textFile("hdfs://n018-data.hursley.ibm.com/user/romeo/web-Google.txt")
val arrayForm = textFile.filter(_.charAt(0)!='#').map(_.split("\\s+")).cache()
val nodes = arrayForm.flatMap(array => array).distinct().map(_.toLong)
val edges = arrayForm.map(line => Edge(line(0).toLong,line(1).toLong))

val graph = Graph(nodes,edges)

不幸的是,我收到了这个错误:

<console>:27: error: type mismatch;
 found   : org.apache.spark.rdd.RDD[Long]
 required: org.apache.spark.rdd.RDD[(org.apache.spark.graphx.VertexId, ?)]
Error occurred in an application involving default arguments.
       val graph = Graph(nodes,edges)

那么如何创建VertexId对象呢?根据我的理解,传递一个Long就足够了。

有什么想法吗?

非常感谢!

罗密欧

2 个答案:

答案 0 :(得分:4)

不完全是。如果您查看apply对象的Graph方法的签名,您会看到类似这样的内容(完整签名请参阅API docs):

apply[VD, ED](
    vertices: RDD[(VertexId, VD)], edges: RDD[Edge[ED]], defaultVertexAttr: VD)

正如您在描述中所读到的那样:

  

根据具有属性的顶点和边的集合构建图形。

因此,您不能简单地将RDD[Long]作为vertices参数传递(RDD[Edge[Nothing]],因为edges也不会有效。)

import scala.{Option, None}

val nodes: RDD[(VertexId, Option[String])] = arrayForm.
    flatMap(array => array).
    map((_.toLong, None))

val edges: RDD[Edge[String]] = arrayForm.
    map(line => Edge(line(0).toLong, line(1).toLong, ""))

请注意:

  

任意挑选重复顶点

所以.distinct()上的nodes在这种情况下已经过时了。

如果您想创建没有属性的Graph,可以使用Graph.fromEdgeTuples

答案 1 :(得分:2)

错误消息指出nodes必须是RDD[(Long, anything else)]的类型。元组中的第一个元素是vertexId,第二个元素可以是任何东西,例如,带有节点描述的String。尝试简单地重复vertexId:

val nodes = arrayForm
             .flatMap(array => array)
             .distinct()
             .map(x =>(x.toLong, x.toLong))