Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Spark Scala中的graph.fromEdgeTuples从CSV文件创建图形_Scala_Csv_Apache Spark_Rdd_Spark Graphx - Fatal编程技术网

如何使用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类型,并且我正在处理字符串)

  • 有没有其他更简单的方法可以从类似的csv文件结构构建图形


  • 欢迎提出任何建议。谢谢

    首先,您应该阅读并理解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)))正是我想要的