#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, однако предоставленное вами сопоставление — это нечто потрясающее