使用向后兼容的模式在Spark中读取旧数据

时间:2017-11-07 15:04:29

标签: scala apache-spark dataframe spark-dataframe

我已经将一些较旧的数据存储在镶木地板中,并带有由

表示的模式
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];

有没有办法为我的所有数据指定向后兼容的架构?

1 个答案:

答案 0 :(得分:2)

为了使用向后兼容的架构读取旧数据,仅指定新的Encoder是不够的,您必须为StructType手动指定DataSet,而不是让Spark根据其中任何一个来推断它。这样,在转换为DataFrame

期间,不会有丢失的字段

spark.read.schema(Encoders.product[B].schema).parquet("test").as[B].collect()

相关问题