Объединить несколько графиков вместе в GraphX - PullRequest
0 голосов
/ 07 июня 2018

Привет, я построил несколько графиков (всего 11)

Пример: График 1 - SongArtist - SongVertex (Id, SongName) ArtistVertex (Id, ArtistName, NetWorth) Edge (Song, Artist, "Sung"")

График 2 - SongWriter - SongVertex (Id, SongName) WriterVertex (Id, ArtistName) Edge (Song, Writer," WrittenBy ") *

График 3 - ArtistWriter- ArtistVertex (Id,ArtistName, NetWorth) WriterVertex (Id, ArtistName) Edge (Artist, Writer, "Collaborated") ...

Я хочу иметь возможность объединить их все в один график.Graph1 и Graph2 можно объединить в Song, а Graph2 и Graph3 можно объединить в Writer, а Graph1 и Graph3 можно объединить в Artist.

Некоторые графы имеют свойства ребер и вершин, определенные классом дел.Ниже показано, как был разработан Graph3.Другие следуют более или менее той же структуре, например:

case class ArtistWriterProperties(weight: String, edgeType: String) extends EdgeProperty
case class ArtistProperty(val vertexType: String, val artistName: String, val netWorth: String) extends VertexProperty
case class WriterProperty(val vertexType: String, val writerName: String) extends VertexProperty

val ArtistWriter: RDD[(VertexId, VertexProperty)] = sc.textFile(vertexArtistWriter).map {
  line =>
    val row = line.split(",")
    val id = row(0).toLong
    val vertexType = row(1)
    val prop = vertexType match {
      case "Artist" => ArtistProperty(vertexType, row(2), row(3))
      case "Writer" => WriterProperty(vertexType, row(2))
    }
    (id, prop)
}

val edgesArtistWriterCollaborated: RDD[Edge[EdgeProperty]] = sc.textFile(edgeWeightedArtistWriterCollaborated).map {
  line =>
    val row = line.split(",")
    Edge(row(0).toLong, row(1).toLong, ArtistWriterProperties(row(2), row(3)))
}

val graph3 = Graph(ArtistWriter, edgesArtistWriterCollaborated)

Я пытался что-то в этом роде:

val graph2And3 = Graph(
  graph2.vertices.union(graph3.vertices),
  graph2.edges.union(graph3.edges)
).partitionBy(RandomVertexCut).
  groupEdges( (attr1, attr2) => attr1 + attr2 )

Но я получаю ошибки - несоответствие типов

1 Ответ

0 голосов
/ 07 июня 2018

Так что в основном вам нужно выполнить join для вершин и union для ребер.

Для каждого графа вы можете получить СДР вершин и СДР ребер.

1) Последовательноfull outer join СДР вершин по требуемым ключам и создание новых идентификаторов для конечных вершин, например, graph1.vertexes.fullOuterJoin(graph2.vertexes, "SongArtist").fullOuterJoin...

2) Объединение всех СДР ребер, а затем вы можете создавать граф из новых СДР вершин и СДР ребер.

...