【问题标题】:How can I create a graph from Text File containing the vertex and edges?如何从包含顶点和边的文本文件创建图形?
【发布时间】:2021-11-19 11:19:21
【问题描述】:

我创建了一个包含两个输入文件的 RDD,即 Edges 和 Node 文件。当我使用 Graph.fromEdge() 方法创建图表时,我得到了错误。有人可以帮我吗? inputEdgesTextFile 和 inputNodesTextFile 正在获取输入文本数据集。 在代码的最后一行,我收到错误。 我发布了我在代码中遇到的错误。

public static void main(String[] args) {

    SparkConf conf = new SparkConf().setMaster("local").setAppName("GraphFileReadClass");
    JavaSparkContext javaSparkContext = new JavaSparkContext(conf);
    ClassTag<String> stringTag = scala.reflect.ClassTag$.MODULE$.apply(String.class);
    ClassTag<String> intTag = scala.reflect.ClassTag$.MODULE$.apply(Integer.class);

    $eq$colon$eq<String, String> tpEquals = scala.Predef.$eq$colon$eq$.MODULE$.tpEquals();
    // Load an external Text File in Apache spark
    //The text files number of lines and each line consists these structure
    //SFEdge contains: | Edge_id integer | Source_Id integer | Destination_id integer | EdgeLength double |
    //SFNodes contains: | Node_id integer | Longitude double | Latitude double |
    
    
    JavaRDD<String> inputEdgesTextFile = javaSparkContext.textFile("./SFEdges.txt");
    JavaRDD<String> inputNodesTextFile = javaSparkContext.textFile("./SFNodes.txt");
    ArrayList<Tuple2<Integer, Integer>> nodes = new ArrayList<>();
    ArrayList<Edge<Double>> edges = new ArrayList<>();

    JavaRDD<NodesClass> nodesPart = inputNodesTextFile.mapPartitions(p -> {
        ArrayList<NodesClass> nodeList = new ArrayList<NodesClass>();
        int counter = 0;
        while (p.hasNext()) {
            String[] parts = p.next().split(" ");
            NodesClass node = new NodesClass();
            node.setNode_Id(Integer.parseInt(parts[0]));
            node.setLongitude(Double.parseDouble(parts[1]));
            node.setLatitude(Double.parseDouble(parts[2]));
            nodes.add(new Tuple2<Integer, Integer>(counter, Integer.parseInt(parts[0])));
            nodeList.add(node);
            counter++;

        }
        return nodeList.iterator();
    });
    JavaRDD<Tuple2<Integer, Integer>> nodesRDD = javaSparkContext.parallelize(nodes);
    nodesRDD.foreach(data -> System.out.print("Node details: " + data._1() + " " + data._2()));

    JavaRDD<EdgeNetwork> edgesPart = inputEdgesTextFile.mapPartitions(p -> {
        ArrayList<EdgeNetwork> edgeList = new ArrayList<EdgeNetwork>();
        while (p.hasNext()) {

            String[] parts = p.next().split(" ");
            EdgeNetwork edgeNet = new EdgeNetwork();
            edgeNet.setEdge_id(Integer.parseInt(parts[0]));
            edgeNet.setSource_id(Integer.parseInt(parts[1]));
            edgeNet.setDestination_id(Integer.parseInt(parts[2]));
            edgeNet.setEdge_length(Double.parseDouble(parts[3]));
            edges.add(new Edge<Double>(Long.parseLong(parts[1]), Long.parseLong(parts[2]),
                    Double.parseDouble(parts[3])));
            edgeList.add(edgeNet);

        }
        return edgeList.iterator();
    });
    JavaRDD<Edge<Double>> edgesRDD = javaSparkContext.parallelize(edges);

    Graph<String, Double> graph = Graph.fromEdges(edgesRDD.rdd(), " ", StorageLevel.MEMORY_ONLY(),
            StorageLevel.MEMORY_ONLY(), stringTag, stringTag);
    //The warning shows above this line for Graph<String,Double>
    //Maybe the RDD that I have created has some errors. Please suggest me

【问题讨论】:

  • 能否为您的输入文件添加示例以及您看到的错误消息?
  • @werner 我已将示例作为 cmets 添加到具有 txt 数据集结构的代码中。请检查一下。

标签: java apache-spark spark-graphx


【解决方案1】:

Graph.fromEdgesScala 中看起来像

def fromEdges[VD: ClassTag, ED: ClassTag](
    edges: RDD[Edge[ED]],
    defaultValue: VD,
    edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
    vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY): Graph[VD, ED] = {
...

这两个类标记在 Java-API 中被翻译为方法末尾的附加参数。 VD这里是string类型,ED是double类型,所以Java调用应该反映这些类型,第二个class标签应该是Double:

ClassTag<Double> doubleTag = scala.reflect.ClassTag$.MODULE$.apply(Double.class);

Graph.fromEdges(edgesRDD.rdd(), " ", StorageLevel.MEMORY_ONLY(),
        StorageLevel.MEMORY_ONLY(), stringTag, doubleTag);

【讨论】:

  • 我用以下代码替换了我的代码,但是,我在控制台上看不到任何打印输出。 Graph&lt;String, Double&gt; graph = Graph.fromEdges(edgesRDD.rdd(), " ", StorageLevel.MEMORY_ONLY(), StorageLevel.MEMORY_ONLY(), stringTag, doubleTag); graph.vertices().toJavaRDD().collect().forEach(System.out::println);
  • 很高兴听到编译器问题已解决!空输出可能是另一个问题,但如果不看数据就很难说。
  • 实际上,我正在尝试使用此链接中免费提供的 SanFranciso 的路网数据集:cs.utah.edu/~lifeifei/SpatialDataset.htm 并且我想在 3 台机器的集群上划分路网地图(暂时)。但是,我从 EdgeRDD 创建的图形没有显示图形打印输出。您能否建议我可以做些什么来为 3 台机器运行平衡的图形分区? @werner
  • 我设法使用 GraphX Edge 类来创建一个 Edge 列表,然后读取文本文件并将其添加到列表中。现在我可以看到 Graph 已创建。但是,我仍然无法运行“PartitionStrategy.RandomVertexCut$.MOUDLE$”。它显示错误“RandomVertexCut$ 无法解析或不是字段”Graph&lt;String, Double&gt; graph = Graph.fromEdges(edgeRDD.rdd(), "", StorageLevel.MEMORY_ONLY(), StorageLevel.MEMORY_ONLY(), stringTag, doubleTag); graph.partitionBy(PartitionStrategy.RandomVertexCut$.MODULE$);
  • @AavashBhandari 我建议您创建一个新问题,因为这对我来说似乎是一个不同的问题。有了新问题,您将有更高的机会获得回复:问题的阅读频率远高于 cmets,因此更多人会看到您的问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-10
  • 2017-01-23
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多