Scala DataFrame имеет подмножество полей класса case, бросая org. apache .spark. sql .AnalysisException - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть Case Class (который действует как выходная схема), который выглядит примерно так:

case class Person(Id: Int, Name: String, Address: String, Profession: String , SkillSet: String)

Далее я читаю кучу файлов паркета и создаю из него фрейм данных , Единственный улов, кроме Id, Name и Address, другие поля, такие как Profession и SkillSet, могут различаться в каждом файле паркета. Например:

val df1 = spark.read.parquet("/tmp/output/pa1.parquet")
df1.printSchema()
root
|-- Id: integer (nullable = true)
 |-- Name: string (nullable = true)
 |-- Address: string (nullable = true)

scala> val df2 = spark.read.parquet("/tmp/output/pa2.parquet")
df2: org.apache.spark.sql.DataFrame = [Id: int, Name: string ... 2 more fields]
scala> df2.printSchema()
root
 |-- Id: integer (nullable = true)
 |-- Name: string (nullable = true)
 |-- Address: string (nullable = true)
 |-- Profession: string (nullable = true)

scala> val df3 = spark.read.parquet("/tmp/output/pb1.parquet")
df3: org.apache.spark.sql.DataFrame = [Id: int, Name: string ... 2 more fields]
scala> df3.printSchema()
root
 |-- Id: integer (nullable = true)
 |-- Name: string (nullable = true)
 |-- Address: string (nullable = true)
 |-- SkillSet: string (nullable = true)

Теперь, когда я читаю все 3 типа файлов паркета и использую «mergeSchema» и отливаю его в свой класс дел, все работает нормально:

val rdf = spark.read.option("mergeSchema","true").parquet("/tmp/output/*.parquet")
val rs = rdf.as[Person]

Проблема возникает когда я читаю 1 или 2 типа этих 3 паркетных файлов. Допустим, я только читаю pa * .parquet

val rdf = spark.read.option("mergeSchema","true").parquet("/tmp/output/pa*.parquet")
val rs = rdf.as[Person]

Это не с:

org.apache.spark.sql.AnalysisException: cannot resolve '`SkillSet`' given input columns: [Id, Name, Address, Profession];

Как лучше всего иметь суперсет / generic c case class, но во время чтения поэкспериментируйте с «похожими» паркетными схемами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...