我有以下案例类:
case class Person(name: String, lastname: Option[String] = None, age: BigInt) {}
以及以下json:
{ "name": "bemjamin", "age" : 1 }
当我尝试将数据框转换为数据集时:
spark.read.json("example.json")
.as[Person].show()
它显示了以下错误:
线程“ main” org.apache.spark.sql.AnalysisException中的异常: 给定以下输入列无法解析“
lastname
”:[年龄,姓名];
我的问题是:如果我的模式是我的案例类,并且它定义了姓氏是可选的,那么as()是否应该进行转换?
我可以使用.map轻松修复此问题,但我想知道是否还有其他更清洁的替代方法。
答案 0 :(得分:1)
执行spark.read.json("example.json").as[Person].show()
时,基本上是将数据帧读取为,
FileScan json [age#6L,name#7]
,然后尝试应用Enpersons for Person对象,因此获得AnalysisException,因为它无法从您的json文件中找到lastname
。
通过提供一些具有姓氏或 试试这个:
val schema: StructType = ScalaReflection.schemaFor[Person].dataType.asInstanceOf[StructType]
val x = spark.read
.schema(schema)
.json("src/main/resources/json/x.json")
.as[Person]
+--------+--------+---+
| name|lastname|age|
+--------+--------+---+
|bemjamin| null| 1|
+--------+--------+---+
希望有帮助。