如何使用Spark Scala中的graph.fromEdgeTuples从CSV文件创建图形
我不熟悉如何使用Spark Scala中的graph.fromEdgeTuples从CSV文件创建图形,scala,csv,apache-spark,rdd,spark-graphx,Scala,Csv,Apache Spark,Rdd,Spark Graphx,我不熟悉Spark和Scala,我正在尝试执行一项简单的任务,即从文本文件中的数据创建一个图形 来自文档 $@FromEdge[VD,ED]%28RDD[Edge[ED]],VD%29%28ClassTag[VD],ClassTag[ED]%29:图形[VD,ED] 我可以看到我可以从顶点的元组创建一个图 我的简单文本文件如下所示,其中每个数字都是一个顶点: v1 v3 v2 v1 v3 v4 v4 v5 v3 当我从文件中读取数据时 val myVertices=myData.map(lin
Spark
和Scala
,我正在尝试执行一项简单的任务,即从文本文件中的数据创建一个图形
来自文档
$@FromEdge[VD,ED]%28RDD[Edge[ED]],VD%29%28ClassTag[VD],ClassTag[ED]%29:图形[VD,ED]
我可以看到我可以从顶点的元组创建一个图
我的简单文本文件如下所示,其中每个数字都是一个顶点:
v1 v3
v2 v1
v3 v4
v4
v5 v3
当我从文件中读取数据时
val myVertices=myData.map(line=>line.split(“”)
我得到一个RDD[Array[String]]
我的问题是:
v1 v3
v2 v1
v3 v4
v4
v5 v3
RDD[Array[String]]
转换为正确的格式,根据文档,格式是RDD[(VertexId,VertexId)]
(另外VertexId
必须是long类型,并且我正在处理字符串)欢迎提出任何建议。谢谢 首先,您应该阅读并理解Spark编程指南: 接下来,您需要确定将在图形中表示哪种边和顶点。鉴于您似乎没有任何要附加到顶点和边的内容,您似乎需要以下内容:
type MyVertex = (Long,Unit)
如果您发现确实有一些东西(如字符串)要附加到每个顶点,则用字符串替换Unit,并在下面用适当的字符串替换null
现在,您需要一个顶点数组(或其他序列),然后将其转换为RDD——如下所示:
val vertices: Seq[MyVertex] = Array(new MyVertex(1L,null),new MyVertex(2L,null),new MyVertex(3L,null))
val rddVertices: RDD[(VertexId, Unit)] = sc.parallelize(vertices)
其中sc是SparkContext的实例。顶点和边将从CSV文件中读取,并适当地转换为long。我不会详细介绍该代码,但它非常简单,特别是如果您更改CSV文件的格式以从每个顶点id中删除“v”前缀
同样,必须创建所需的边:
type MyEdge = Edge[Unit]
val edge1 = new MyEdge(1L,2L)
val edge2 = new MyEdge(2L,3L)
val edges = Array(edge1,edge2)
val rdd = sc.parallelize(edges)
最后,创建图形:
val graph = Graph(rddVertices,rddEdges)
我在我自己的应用程序中也有类似的代码,我试图将其转化为您所需要的,但我不能保证这是完美的。但这应该可以让您开始了。有很多方法可以从文本文件创建图形 此代码通过graph.fromEdgeTuples方法创建图形
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.graphx.GraphLoader
import scala.util.MurmurHash
import org.apache.spark.graphx.Graph
import org.apache.spark.rdd.RDD
import org.apache.spark.graphx.VertexId
object GraphFromFile {
def main(args: Array[String]) {
//create SparkContext
val sparkConf = new SparkConf().setAppName("GraphFromFile").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
// read your file
/*suppose your data is like
v1 v3
v2 v1
v3 v4
v4 v2
v5 v3
*/
val file = sc.textFile("src/main/resources/textFile1.csv");
// create edge RDD of type RDD[(VertexId, VertexId)]
val edgesRDD: RDD[(VertexId, VertexId)] = file.map(line => line.split(" "))
.map(line =>
(MurmurHash.stringHash(line(0).toString), MurmurHash.stringHash(line(1).toString)))
// create a graph
val graph = Graph.fromEdgeTuples(edgesRDD, 1)
// you can see your graph
graph.triplets.collect.foreach(println)
}
}
杂音散列。之所以使用stringHash,是因为文件包含字符串形式的顶点。如果它是数字类型,则不需要它。如果您的文件是边缘列表格式,例如
v1 v3
v2 v1
v3 v4
v5 v3
然后,您可以简单地使用以下方法,从边的端点计算出顶点:
import org.apache.spark.graphx._
val graph = GraphLoader.edgeListFile(sc, "so_test.txt")
然而,就目前的情况来看,“v4”本身意味着edgeListFile会抛出一个异常您可以使用一个好的散列函数将字符串值转换为长字符串。非常感谢您,这一位:val-edgesRDD:RDD[(VertexId,VertexId)]=file.map(line=>line.split(“”)。map(line=>(murrushash.stringHash(line(0.toString)stringHash(第(1)行.toString)))正是我想要的