当前位置: 首页 > 知识库问答 >
问题:

如何检查空scala.math.BigDecimal?

席俊驰
2023-03-14

下面的代码引发NullPointerException。即使有Option(x._1. F2). isDe放心

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]
  }

import org.apache.spark.sql.{functions => func}
val j = readTable().joinWith(readTable(), func.lit(true))
readTable().filter(x => 
  (if (Option(x._1.F2).isDefined && Option(x._2.F2).isDefined 
       && (x._1.F2- x._2.F2< 1)) 1 else 0)  //line 51
  + ..... > 100)

我尝试了!(x._1. F2==null||x._2. F2==null),但它仍然获得异常。

例外的是


java.lang.NullPointerException
        at scala.math.BigDecimal.$minus(BigDecimal.scala:563)
        at MappingPoint$$anonfun$compare$1.apply(MappingPoint.scala:51)
        at MappingPoint$$anonfun$compare$1.apply(MappingPoint.scala:44)
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source)
        at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
        at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:395)
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:234)
        at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:228)
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:827)
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:827)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
        at org.apache.spark.scheduler.Task.run(Task.scala:108)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

更新:我尝试了下面的表达式,但执行仍然命中了第1行。F2-x._2。F2。这是一种检查BigDecimal是否为null的方法吗?

(if (!(Option(x._1.F2).isDefined && Option(x._2.F2).isDefined
       && x._1.F2!= null && x._2.F2!= null)) 0
       else (if (x._1.F2- x._2.F2< 1) 1 else 0))

在我将负数包装到(math.abs((l.F2-r.F2))中之后,异常消失了。toDouble)。为什么?


共有2个答案

红明德
2023-03-14

查看BigDecimal的源代码,第563行:https://github.com/scala/scala/blob/v2.11.8/src/library/scala/math/BigDecimal.scala#L563

有可能x._1. F2.bigDecimalx._2. F2.bigDecimalnull,尽管我不确定这是如何发生的,因为构造函数会检查它。但是也许检查那里的null,看看这是否能解决问题?

顺便说一句,你真的应该避免所有的<代码>_1_2。。。你应该能够做以下事情:

val (l: Cols, r: Cols) = x

提取元组值。

牛越
2023-03-14

尝试将此添加到您的if语句中:

<代码>

我在Java也有类似的问题,这对我很有效。

 类似资料:
  • 我定义了一个结构… 有时我给它分配一个空会话(因为不可能为零) 然后我想检查一下,如果它是空的: 显然这是行不通的。我怎么写?

  • 我有如下所示的JSON 我将文件读成字符串并创建一个JSONObject,如下所示 然而,我认为我可以用try catch将语句括起来 请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。 您还可以分享使用JSONException在此上下文中是否有任何“优点”吗?

  • 我需要在JPA查询中传递这个参数。 我如何才能实现这一点,而不是为IS NULL&IS NOT NULL创建2个单独的查询。

  • 问题内容: 如何在JavaScript中检查空值?我在下面编写了代码,但是没有用。 在JavaScript程序中如何找到错误? 问题答案: JavaScript在检查“空”值方面非常灵活。我猜您实际上是在寻找空字符串,在这种情况下,这种简单的代码将起作用: 这将检查空字符串(), ,, 以及数字和 请注意,如果您专门检查数字,则使用此方法时常会犯错,对于返回的函数,它是首选(或(或(也检查了错误代

  • 我有一个名为< code>Person的对象。 它有几个属性; 我设置了一个person对象,比如< code>Person p = new Person(1,“Joe”);。 1.) 我需要检查对象是否为空;以下表达式是否正确; 2.)我需要知道ID是否包含Int。 但是,java不允许这样做。我该怎么办?

  • 问题内容: 如何检查是否为空? 问题答案: 您自己说过的,请检查它是: 看,PHP非常简单。您可以简单地写下您的想法;) 这种方法很安全。如果未设置(可能,但可能),则可能会给您提供未定义的变量E_NOTICE 。