Scala / Spark惯用的方法来处理DataSet中的空值?

时间:2017-07-18 18:19:42

标签: scala apache-spark

以下代码从数据库表中读取数据并返回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)

2 个答案:

答案 0 :(得分:4)

Options是惯用的方式

case class Cols (F1: Option[String], F2: Option[BigDecimal], F3: Option[Int], F4: Option[Date], ...)

databricks style guide

中讨论了性能损失

答案 1 :(得分:2)

Option(null)将返回None

因此,例如:

val r = readTable.filter(x => (if (Option(x.F3).getOrElse(0) >