使用带有选项字段的案例类将数据帧转换为数据集

时间:2019-03-12 04:33:15

标签: scala apache-spark apache-spark-sql apache-spark-dataset

我有以下案例类:

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轻松修复此问题,但我想知道是否还有其他更清洁的替代方法。

1 个答案:

答案 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|
+--------+--------+---+

希望有帮助。

相关问题