我有以下案例类:
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
':[age,name];
我的问题是:如果我的架构是我的案例类,并且它定义了lastname是可选的,那么as()不应该进行转换吗?
我可以使用.map轻松解决这个问题,但我想知道是否有另一个更清洁的替代方案。
我们还有一个选项来解决上述问题。需要两个步骤
import org.apache.spark.sql.Encoders
val schema = Encoders.product[Person].schema
您可以更新代码,如下所示。
val schema = Encoders.product[Person].schema
val df = spark.read
.schema(schema)
.json("/Users/../Desktop/example.json")
.as[Person]
+--------+--------+---+
| name|lastname|age|
+--------+--------+---+
|bemjamin| null| 1|
+--------+--------+---+
当你执行spark.read.json("example.json").as[Person].show()
时,它基本上是在读取数据帧,
FileScan json [age#6L,name#7]
然后尝试为Person对象应用编码器,从而获得AnalysisException,因为它无法从您的json文件中找到lastname
。
您可以通过提供一些具有姓氏的数据来提示spark 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|
+--------+--------+---+
希望能帮助到你。