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

java.lang.NumberFormatException:对于输入字符串:"nan"on select count(*)on a table

隗锐进
2023-03-14
scala prettyprint-override">case class Varnish(ID: String, varnish_latency: Float)


val seq = sc.sequenceFile[LongWritable, BytesWritable](logfile_path)
val usableRDD = seq.map({case (_, v : BytesWritable) => Text.decode(v.getBytes)})
                   .map(_.split(" "))
                   .map(p => Varnish(p(11), p(8).toFloat))
                   .toDF()
usableRDD.registerTempTable("Varnish")
sqlContext.sql("SELECT * from Varnish LIMIT 5").collect().foreach(println) // works fine
val countResult = sqlContext.sql("SELECT COUNT(*) FROM Varnish").collect() // throws Err
val cnt2 = countResult.head.getLong(0)

2003年1月16日02:56:18阿卡斯巴克河。男演员default-dispatcher-20 INFO RemoteActorRefProvider$RemotingTerminator:关闭远程守护程序
16/01/23 02:56:18线程-3信息应用程序管理员:注销应用程序管理员失败(诊断消息:用户类引发异常:org.apache.spark.SparkException:作业因阶段失败而中止:阶段1.0中的任务57失败了4次,最近一次失败:
在阶段1.0中丢失了任务57.3(TID 89,10.1.201.14):java。lang.NumberFormatException:对于输入字符串:“nan”
在sun。杂项。浮动十进制。readJavaFormatString(FloatingDecimal.java:1250)

共有1个答案

华睿识
2023-03-14

异常似乎是相当不言自明的。您传递的一些值包含nan字符串,该字符串未被解释为有效的Float表示:

scala> "nan".toFloat
java.lang.NumberFormatException: For input string: "nan"
...

只要数据不是来自已经验证过的源(如RDBMS或拼花文件),就不要盲目相信它的格式是正确的。您可以使用以下选项修改代码以正确处理此情况和其他格式错误的条目:

import scala.util.Try

case class Varnish(ID: String, varnish_latency: Option[Float])

...
  .map(p => Varnish(p(11), Try(p(8).toFloat).toOption))

删除case类并使用SQL处理:

...
  .map(p => Varnish(p(11), p(8)))
  .toDF("ID", "varnish_latency")
  .withColumn("varnish_latency", $"varnish_latency".cast("double"))

或在调用. toFloat并删除格式错误的条目之前进行预验证。

前两个选项将Nones转换为nulls。由于它在语义上不精确(原始not-a-number与缺失值),并且会导致信息丢失,因此您可能更喜欢显式处理“nan”情况。例如,可以在调用toFloat或模式匹配之前,将“nan”替换为“nan”(正确的表示法):

p(8) match {
  case "nan" => Float.NaN
  case s => s.toFloat
}
 类似资料:
  • 问题内容: 我正在尝试获得系统的运行平衡。为此,我从AMOUNT列获取jtable中所有数字的总和,然后将总和减去txtLoanAmount内部的值。这是我的代码段: 现在我收到错误消息: 我该如何解决呢?任何帮助将不胜感激。谢谢 问题答案: 由于Float.parseFloat()和Float.valueOf()始终将数字假定为您的本地格式,因此,这是一个简短的示例,如果您的语言环境与您获取的数

  • 问题内容: 所以,我有一个问题真的困扰我。我有一个用Java开发的简单解析器。这是相关代码: 输入文件是CSV文件,文件的第一项是整数。当我开始解析时,我立即得到这个异常: 我检查了文件,它的第一个值确实为1(该字段中没有其他字符),但仍然收到消息。我认为这可能是由于文件编码所致:它是UTF-8,带有Unix终端。该程序在Ubuntu 14.04上运行。欢迎寻找问题的任何建议。 问题答案: 您在该

  • 问题内容: 在运行我的代码时,我得到了: 如何防止此异常发生? 问题答案: 不是整数。如果尝试将其解析为整数,则必须抛出该异常。 解析前请检查或Exception正确处理。 异常处理 或- 整数模式匹配

  • 我正在研究背包问题,我是Java新手。我可以像这样手动添加数字: 但是,我无法允许用户输入数字 第一个数字应该是目标,然后是权重<因此,我尝试将用户输入作为字符串,并用空格将其拆分,然后将其转换为整数<接下来,我尝试用两种方法进行parseInt,但都没有成功 以下是代码: 以下是错误: 异常线程"main"java.lang.NumberFormatException:对于输入字符串:"18 7