当然,您可以将 Row 对象匹配到案例类中。假设您的 SchemaType 有许多字段,并且您希望将其中一些字段匹配到您的案例类中。如果您没有空字段,您可以简单地执行以下操作:
case class MyClass(a: Long, b: String, c: Int, d: String, e: String)
dataframe.map {
case Row(a: java.math.BigDecimal,
b: String,
c: Int,
_: String,
_: java.sql.Date,
e: java.sql.Date,
_: java.sql.Timestamp,
_: java.sql.Timestamp,
_: java.math.BigDecimal,
_: String) => MyClass(a = a.longValue(), b = b, c = c, d = d.toString, e = e.toString)
}
这种方法在空值的情况下会失败,并且还需要您明确定义每个字段的类型。如果您必须处理空值,则需要通过执行丢弃所有包含空值的行
dataframe.na.drop()
即使空字段不是在您的案例类的模式匹配中使用的字段,这也会删除记录。或者,如果您想处理它,您可以将 Row 对象转换为 List ,然后使用选项模式:
case class MyClass(a: Long, b: String, c: Option[Int], d: String, e: String)
dataframe.map(_.toSeq.toList match {
case List(a: java.math.BigDecimal,
b: String,
c: Int,
_: String,
_: java.sql.Date,
e: java.sql.Date,
_: java.sql.Timestamp,
_: java.sql.Timestamp,
_: java.math.BigDecimal,
_: String) => MyClass(
a = a.longValue(), b = b, c = Option(c), d = d.toString, e = e.toString)
}
查看这个 github 项目 Sparkz (),它很快就会引入许多库来简化 Spark 和 DataFrame API,并使它们更加面向函数式编程。