以下代码从数据库表中读取数据并返回DataSet[Cols]
。
case class Cols (F1: String, F2: BigDecimal, F3: Int, F4: Date, ...)
def readTable() : DataSet[Cols] = {
import sqlContext.sparkSession.implicits._
sqlContext.read.format("jdbc").options(Map(
"driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"url" -> jdbcSqlConn,
"dbtable" -> s"..."
)).load()
.select("F1", "F2", "F3", "F4")
.as[Cols]
}
值可能为空。后来在使用这些字段时引发了运行时异常。
val r = readTable.filter(x => (if (x.F3 > ...
在DataSet中处理空值的Scala惯用方法是什么?
运行代码时出错。
java.lang.NullPointerException at scala.math.BigDecimal.$minus(BigDecimal.scala:563) at MappingPoint$$anonfun$compare$1.apply(Mapping.scala:51)
答案 0 :(得分:4)
Options是惯用的方式
case class Cols (F1: Option[String], F2: Option[BigDecimal], F3: Option[Int], F4: Option[Date], ...)
中讨论了性能损失
答案 1 :(得分:2)
Option(null)
将返回None
。
因此,例如:
val r = readTable.filter(x => (if (Option(x.F3).getOrElse(0) >