Чтобы преобразовать СДР в фрейм данных , проще всего использовать toDF()
в Scala.Чтобы использовать эту функцию, необходимо импортировать имплики, которые выполняются с использованием объекта SparkSession
.Это можно сделать следующим образом:
val spark = SparkSession.builder().getOrCreate()
import spark.implicits._
val df = rdd.toDF("features")
toDF()
принимает СДР из кортежей.Когда СДР состоит из общих объектов Scala, они будут неявно преобразованы, то есть нет необходимости делать что-либо, а когда СДР имеет несколько столбцов, нет необходимости также что-либо делать, СДР уже содержит кортеж.Однако в этом особом случае вам необходимо сначала преобразовать RDD[org.apache.spark.ml.linalg.Vector]
в RDD[(org.apache.spark.ml.linalg.Vector)]
.Поэтому необходимо выполнить преобразование в кортеж следующим образом:
val df = rdd.map(Tuple1(_)).toDF("features")
Выше приведено преобразование СДР в кадр данных с одним столбцом, называемым функциями.
Для преобразованиядля набора данных самый простой способ - использовать класс case.Убедитесь, что класс case определен вне объекта Main.Сначала преобразуйте СДР в кадр данных, затем выполните следующие действия:
case class A(features: org.apache.spark.ml.linalg.Vector)
val ds = df.as[A]
Чтобы показать все возможные преобразования, получить доступ к базовому СДР из кадра данных или набора данных можно с помощью .rdd
:
val rdd = df.rdd
Вместо преобразования назад и вперед между RDD и наборами данных / наборами данных, как правило, легче выполнять все вычисления с использованием API-интерфейса dataframe.Если нет подходящей функции для выполнения того, что вы хотите, обычно можно определить UDF, определяемую пользователем функцию.Смотрите, например, здесь: https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-udfs.html