我已经将一些较旧的数据存储在镶木地板中,并带有由
表示的模式case class A(name: String)
我想在
中添加一个新的非必填字段case class B(name: String, age: Option[Int])
并将旧数据和新数据都读入同一DataFrame
。每次我尝试用spark.read.parquet("test_path").as[B].collect()
读取数据时,我都会遇到以下异常:
线程“main”中的异常org.apache.spark.sql.AnalysisException:无法解析给定输入列的“age”:[name];
有没有办法为我的所有数据指定向后兼容的架构?
答案 0 :(得分:2)
为了使用向后兼容的架构读取旧数据,仅指定新的Encoder
是不够的,您必须为StructType
手动指定DataSet
,而不是让Spark根据其中任何一个来推断它。这样,在转换为DataFrame
:
spark.read.schema(Encoders.product[B].schema).parquet("test").as[B].collect()