Spark graphx: как трассировать график для создания графика соседей второй степени

Я начинаю начинать с вычисления искры /hadoop/graph, поэтому, пожалуйста, извините мой вопрос начинающего.

Я создал график, используя graphx. Теперь, для каждой вершины, я хочу получить все его соседи второй степени. поэтому, если мой график:

v1 --> v2
v1 --> v4
v1 --> v6

Я хочу получить что-то вроде:

v2 --> v4
v2 --> v6
v4 --> v2
v4 --> v6
v6 --> v2
v6 --> v4

Мой график очень большой, поэтому я хотел бы сделать это элегантно и эффективно, насколько это возможно.

У меня такое чувство, что это не должно быть слишком сложно, но, как новичок в этой огромной структуре, я нахожусь во всех документах/источниках, пытаясь понять это.

Есть ли у кого-нибудь совет, что будет лучшим способом сделать это за экземпляр графа?

Спасибо!

Ответ 1

Из вашего примера я беру вашу проблему в том, что вы хотите построить граф, который имеет ребро a → b, если только если в исходном графе была вершина v и ребра v → a и v → b. (Это может быть или не быть стандартным определением "соседа второй степени" в ориентированном графе, но в любом случае интересно.)

Здесь решение в Scala. Он создает граф со всеми исходными вершинами, но только с требуемыми ребрами. Я помещаю пустые строки как данные во все вершины и ребра.

Предполагая, что SparkContext sc, как обычно, попадает в оболочку Spark и доступен GraphX, настройте примерный граф:

val vertices: RDD[(VertexId, String)] =
    sc.parallelize(Array((1L,""), (2L,""), (4L,""), (6L,"")))

val edges: RDD[Edge[String]] =
    sc.parallelize(Array(Edge(1L, 2L, ""), Edge(1L, 4L, ""), Edge(1L, 6L, "")))

val inputGraph = Graph(vertices, edges)

Составьте чередующийся набор вершин, каждый из которых аннотируется множеством их преемников, поэтому в вашем примере v1 будет аннотироваться с помощью {v2, v4, v6}.

val verticesWithSuccessors: VertexRDD[Array[VertexId]] = 
    inputGraph.ops.collectNeighborIds(EdgeDirection.Out)

Создайте новый граф, используя эти вершины и исходные ребра.

val successorSetGraph = Graph(verticesWithSuccessors, edges)

Теперь нам нужно нажимать эти множества вдоль каждого ребра, создавая еще один набор вершин, на этот раз все аннотируются со своими соседями. Нам нужно комбинировать наборы в вершинах адресатов, поэтому с помощью Scala Set удаляются дубликаты. Нам также нужно удалить каждую вершину из множества ее соседей, а значит, добавим дополнительные map в конец.

val ngVertices: VertexRDD[Set[VertexId]] =  
    successorSetGraph.mapReduceTriplets[Set[VertexId]] (
        triplet => {
            Iterator((triplet.dstId, triplet.srcAttr.toSet))
        },
        (s1, s2) => s1 ++ s2
    ).mapValues[Set[VertexId]](
        (id: VertexId, neighbors: Set[VertexId]) => neighbors - id
    )

Теперь мы почти готовы создать окончательный график, но нам нужно ребро для каждого соседнего отношения:

val ngEdges = ngVertices.flatMap[Edge[String]](
  {
    case (source: VertexId, allDests: Set[VertexId]) => {
      allDests.map((dest: VertexId) => Edge(source, dest, ""))
    }
  }
)

Теперь мы можем собрать все это вместе:

val neighborGraph = Graph(vertices, ngEdges)

Я уверен, что эксперт может сделать лучше, особенно с точки зрения производительности, но большинство идей, на которые это опирается, можно найти в Руководство по программированию GraphX.

Ответ 2

Я хотел перефразировать ту же проблему на неориентированном графе, где граф представлен нижними строками в текстовом файле, где каждая пара соединена A, BA, CA, DB, DB, EF, GF, Q. Я хотел отобразить пары вершин второго порядка из график как вывод приведен ниже. Будет ли решение, указанное выше, будет работать для этой проблемы. Иначе, пожалуйста. опубликовать решение (C, D) (G, Q) (A, E) (B, C) (D, E)

Ответ 3

вышеуказанный вопрос до сих пор остается без ответа. У меня похожий вопрос на неориентированном графе, имеющем пары вершин, образующие ребра графа. Допустим, скажем, (ab), (ac), (ad), (bd), (be), (pq), (pr). Каждая пара стоит 1. Как пройти график, чтобы создать график второй степени (или н градус) соседи Может ли любой искровой пользователь предоставить решение

apache-spark-user-list #spark #spark #databricks