繁体   English   中英

创建并附加数据到Spark graphx Java

[英]Create and append data to spark graphx java

我将Java对象Transaction(对象买方,对象交易者,付款的Int)放入Java Spark应用程序中,我想制作一个图(带有graphx),其中Vertex是买方和交易者,并且支付是边。 此外,如何添加另一个传入交易?

您可以通过提供所需的verticesedges手动构建图形:

    JavaRDD<Tuple2<Long, String>> vertices = sc.parallelize(new 
     Lists.newArrayList({
      Tuple2(1L, "one"), Tuple2(2L, "two"),
      Tuple2(3L, "three"), Tuple2(4L, "four")})
    );

    JavaRDD<Edge> relationships =
      sc.parallelize(Lists.newArrayList({
        Edge(1L, 2L, 1.0), Edge(1L, 4L, 2.0),
        Edge(2L, 4L, 3.0), Edge(3L, 1L, 1.0),
        Edge(3L, 4L, 5.0)}
      );

Graph(relationships, vertices, StorageLevel.MEMORY_ONLY(), StorageLevel.MEMORY_ONLY(), stringTag, stringTag);

此外,您可以将这种方法应用于CSVTSV或任何方便的文件格式。

如果要使用Dataframe API进行图形数据处理,则绝对应该看一下GraphFrames

UPD

  1. 我如何在Java中初始化它?

导入Graph类:

import org.apache.spark.graphx.Graph

的类型是顶点和边类型Graph<VD,ED>因此您可以使用顶点,边,存储级别和类型标签来初始化此类-Scala中Java API的要求是,您只能指定顶点和边。

        System.setProperty("hadoop.home.dir", "C:\\softwares\\Winutils");
        SparkConf conf = new SparkConf().setMaster("local").setAppName("graph");
        JavaSparkContext javaSparkContext = new JavaSparkContext(conf);
        ClassTag<String> stringTag = scala.reflect.ClassTag$.MODULE$.apply(String.class);


        List<Edge<String>> edges = new ArrayList<>();

        edges.add(new Edge<String>(1, 2, "Friend1"));
        edges.add(new Edge<String>(2, 3, "Friend2"));
        edges.add(new Edge<String>(1, 3, "Friend3"));
        edges.add(new Edge<String>(4, 3, "Friend4"));
        edges.add(new Edge<String>(4, 5, "Friend5"));
        edges.add(new Edge<String>(2, 5, "Friend6"));


        JavaRDD<Edge<String>> edgeRDD = javaSparkContext.parallelize(edges);


        Graph<String, String> graph = Graph.fromEdges(edgeRDD.rdd(), "",StorageLevel.MEMORY_ONLY(), StorageLevel.MEMORY_ONLY(), stringTag, stringTag);


        graph.vertices().toJavaRDD().collect().forEach(System.out::println);
  1. 当发生新交易时,想法是将其添加到图形中,是否有一种类似“添加”的方法?

Apache Spark RDD不适用于细粒度的更新。 RDD上的所有操作都与更改整个RDD有关。 如果您有较大的更新操作图,则由于频繁的随机操作会导致大量内存消耗。 但是,如果您不希望频繁地重建图,则可以简单地从先前的Graph实例复制顶点/边,并向其添加更新。 如果您的用例是频繁的数据更新,则最好使用另一种方法-在数据库端处理更新:如果需要将图形存储在数据库中,则CassandraHBase专为强大的插入/更新操作而设计-考虑使用Neo4J

您可以将上述NoSQL DB的用法与Spark GraphX结合使用-通过调度程序通过Spark SQL数据提取到Graph ,一些信号,来自Kafka的消息等,然后进一步加载到Graph和必要的处理(我有此步骤的示例使用Scala最受欢迎的算法,使用Java就不难了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM