我已经将一些较旧的数据存储在镶木地板中,其模式由
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: 无法解析给定输入列的"年龄": [name];
有没有办法为我的所有数据指定向后兼容的架构?
读取具有向后兼容模式的旧数据,仅仅指定新的Encoder
是不够的,您必须手动为DataSet
指定StructType
,并且不要让Spark根据其中任何一个来推断它。这样,在转换为DataFrame
期间就不会缺少字段:
spark.read.schema(Encoders.product[B].schema).parquet("test").as[B].collect()