Создать фрейм данных из RDD [класс] - PullRequest
0 голосов
/ 20 февраля 2019

В моем искровом коде есть RDD[Person], и я хочу преобразовать этот rdd в dataframe.Класс Person не является классом case, это обычный класс Scala.Я знаю, с делом класса, но я не могу перейти из обычного класса Scala.Пожалуйста, помогите

1 Ответ

0 голосов
/ 22 февраля 2019

Ограничение для 22 полей в случае классов было исправлено в Scala 2.11.Можно создать класс дел с 22 + полями:

// 23 letters of the English alphabet
scala> case class Large(
     |   a: Int, b: Int, c: Int, d: Int,
     |   e: Int, f: Int, g: Int, h: Int,
     |   i: Int, j: Int, k: Int, l: Int,
     |   m: Int, n: Int, o: Int, p: Int,
     |   q: Int, r: Int, s: Int, t: Int,
     |   u: Int, v: Int, w: Int)

Он отлично работает с обычным API Spark DataFrame:

  import org.apache.log4j.{Level, Logger}
  import org.apache.spark.sql.SparkSession
  Logger.getLogger("org").setLevel(Level.ERROR) // Silencing trash
  val spark = SparkSession
    .builder
    .master("local")
    .appName("test")
    .getOrCreate()

  import spark.implicits._
  val sc = spark.sparkContext

  case class Large(
                    a: Int, b: Int, c: Int, d: Int,
                    e: Int, f: Int, g: Int, h: Int,
                    i: Int, j: Int, k: Int, l: Int,
                    m: Int, n: Int, o: Int, p: Int,
                    q: Int, r: Int, s: Int, t: Int,
                    u: Int, v: Int, w: Int)

  val large = Large(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)

  val lettersDF: DataFrame = spark.sparkContext.parallelize(Seq(large)).toDF()
  lettersDF.show()

Но есть два ограничения для классов дел с 22+ поля: Large.tupled и Large.unapply недоступны.Эти методы не существуют в Large.

Если эти ограничения имеют решающее значение для вас, существует обходной путь - программно определяющий схему.

Цитата изофициальная документация:

Когда классы прецедентов не могут быть определены заранее (например, структура записей закодирована в виде строки, или будет проанализирован текстовый набор данных, и поля будут проектироваться по-разному для разныхпользователи), DataFrame может быть создан программно за три шага.

  • Создание RDD строк из исходного RDD;
  • Создание схемы, представленной StructType, соответствующей структуре строкв СДР, созданном на шаге 1.
  • Примените схему к СДР строк с помощью метода createDataFrame, предоставленного SparkSession.

По сути, вам нужно создать схему длясоответствующий класс и применить его к строкам.Вы можете найти пример по ссылке выше.

HTH

...