apache spark graphx — создание VertexRDD из таблицы sql

#apache-spark #apache-spark-sql #spark-graphx

#apache-spark #apache-spark-sql #spark-graphx

Вопрос:

У меня есть таблица, которую я загружаю в Dataframe в Spark, она имеет следующую схему:

 verticesDf.printSchema

root
 |-- id: integer (nullable = true)
 |-- target: string (nullable = true)
 |-- batch_id: integer (nullable = true)
 |-- x: double (nullable = true)
 |-- y: double (nullable = true)
 |-- z: double (nullable = true)
 |-- size: double (nullable = true)
  

Как я могу преобразовать его в VertexRDD, чтобы позже я мог построить с ним график?

Я пытался выполнить следующее:

 case class SRow( target:String, batch_id:Double, x:Double, y:Double, z:Double, size:Double)
val sourceDS: Dataset[(VertexId, SRow)] = verticesDf.as[(VertexId, SRow)]
val vertVX=VertexRDD(sourceDS)
  

но это и многие другие не дают результата — я всегда получаю некоторое несоответствие типов. Каков правильный способ?

Ответ №1:

По крайней мере, для создания графика вам понадобятся два RDD. Один из типов RDD[(VertexId, VD)] , который содержит вершины. A VertexId — это не что иное, как a Long , и VD может быть чем угодно Srow , например, вашим классом. Другой RDD имеет тип RDD[Edge[ED]] , где ED аналогично VD может быть что угодно.

Здесь вы рассказываете о создании vextex RDD. Вы пытаетесь преобразовать свой фрейм данных в набор данных типа Dataset[(VertexId, SRow)] . Это не работает по двум причинам. id является целым числом, а не длинным, и структура неправильная. Ваш фрейм данных содержит более двух столбцов.

Вот как это сделать:

 val vertices = verticesDf
    .select(
       // we transform the id to a long
       'id cast "long",
       // we create a struct with the other columns that will be turned into a Srow
       struct(verticesDf.columns.tail.map(col) : _*))
    .as[(Long, SRow)]

// we also need edges, let's create a dummy RDD
val edges = sc.parallelize(Seq(Edge(1L, 2L, "test")))

// And voila
val graph: Graph[SRow,String] = Graph(vertices.rdd, edges)
  

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

Комментарии:

1. спасибо за ответ. после публикации вопроса я также смог перейти к приведению integer к long, однако предоставленное вами сопоставление — это нечто потрясающее