Ограничение для 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