Apache spark java.lang.NumberFormatException:对于输入字符串,在表的select count(*)上的“nan” case类VarnishID:String,varnish\u延迟:Float val seq=sc.sequenceFile[LongWritable,BytesWritable]日志文件\u路径 val usableRDD=seq.map{case},v:BytesWritable=>Text.decodev.getBytes} .map\uu.split .mapp=>Varnishp11,p8.toFloat 托夫先生 usableRDD.RegisterEmptableVarnish sqlContext.sqlSELECT*来自Varnish LIMIT 5.collect.foreachprintln//效果良好 val countResult=sqlContext.sqlSELECT COUNT*FROM Varnish.collect//抛出错误 val cnt2=countResult.head.getLong0
16/01/23 02:56:18 sparkDriver-akka.actor.default-dispatcher-20 INFO RemoteActorRefProvider$RemotingTerminator:关闭远程守护程序。 16/01/23 02:56:18 Thread-3 INFO ApplicationMaster:注销ApplicationMaster并显示失败的诊断消息:用户类引发异常:org.apache.spark.sparkeException:作业因阶段失败而中止:阶段1.0中的任务57失败4次,最近一次失败: 在阶段1.0 TID 89,10.1.201.14中丢失了任务57.3:java.lang.NumberFormatException:对于输入字符串:nan 在sun.misc.FloatingDecimal.readJavaFormatStringFloatingDecimal.java:1250Apache spark java.lang.NumberFormatException:对于输入字符串,在表的select count(*)上的“nan” case类VarnishID:String,varnish\u延迟:Float val seq=sc.sequenceFile[LongWritable,BytesWritable]日志文件\u路径 val usableRDD=seq.map{case},v:BytesWritable=>Text.decodev.getBytes} .map\uu.split .mapp=>Varnishp11,p8.toFloat 托夫先生 usableRDD.RegisterEmptableVarnish sqlContext.sqlSELECT*来自Varnish LIMIT 5.collect.foreachprintln//效果良好 val countResult=sqlContext.sqlSELECT COUNT*FROM Varnish.collect//抛出错误 val cnt2=countResult.head.getLong0,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,16/01/23 02:56:18 sparkDriver-akka.actor.default-dispatcher-20 INFO RemoteActorRefProvider$RemotingTerminator:关闭远程守护程序。 16/01/23 02:56:18 Thread-3 INFO ApplicationMaster:注销ApplicationMaster并显示失败的诊断消息:用户类引发异常:org.apache.spark.sparkeException:作业因阶段失败而中
这个例外似乎是不言自明的。您传递的某些值包含未解释为有效浮点表示形式的nan字符串: scala>nan.toFloat java.lang.NumberFormatException:用于输入字符串:nan ... 只要数据不是来自已经验证过的源(如RDBMS或拼花文件),您就不应该盲目相信它的格式是正确的。您可以使用以下选项修改代码以正确处理此情况和其他格式不正确的条目: 导入scala.util.Try case类VarnishID:String,varnish\u延迟:选项[Float] ... .mapp=>Varnishp11,Tryp8.toFloat.toOption 删除case类并使用SQL处理此问题: ... .mapp=>Varnishp11,p8 .toDFID,varnish\u延迟 .withColumnvarnish\u latency,$varnish\u latency.castdouble 或者在调用.toFloat并删除格式错误的条目之前进行预验证 前两个选项将Nones转换为null。由于原始not-a-number与缺失值在语义上不精确,并导致信息丢失,因此您可能更喜欢显式处理nan案例。例如,可以在调用toFloat或模式匹配之前,将nan替换为nan正确表示:
p(8) match {
case "nan" => Float.NaN
case s => s.toFloat
}
这个例外似乎是不言自明的。您传递的某些值包含未解释为有效浮点表示形式的nan字符串: scala>nan.toFloat java.lang.NumberFormatException:用于输入字符串:nan ... 只要数据不是来自已经验证过的源(如RDBMS或拼花文件),您就不应该盲目相信它的格式是正确的。您可以使用以下选项修改代码以正确处理此情况和其他格式不正确的条目: 导入scala.util.Try case类VarnishID:String,varnish\u延迟:选项[Float] ... .mapp=>Varnishp11,Tryp8.toFloat.toOption 删除case类并使用SQL处理此问题: ... .mapp=>Varnishp11,p8 .toDFID,varnish\u延迟 .withColumnvarnish\u latency,$varnish\u latency.castdouble 或者在调用.toFloat并删除格式错误的条目之前进行预验证 前两个选项将Nones转换为null。由于原始not-a-number与缺失值在语义上不精确,并导致信息丢失,因此您可能更喜欢显式处理nan案例。例如,可以在调用toFloat或模式匹配之前,将nan替换为nan正确表示:
p(8) match {
case "nan" => Float.NaN
case s => s.toFloat
}
这就是我一直在寻找的解决方案。谢谢对不起,我是scala新手,如何在scala案例匹配中继续。我想忽略/删除p8==nan的列。p8 match{case nan=>?case s=>s.toFloat}有不同的方法可以实现这一点,但是flatMap+empty Seq是我个人的选择。这是我一直在寻找的解决方案。谢谢对不起,我是scala新手,如何在scala案例匹配中继续。我想忽略/删除p8==nan的列。p8 match{case nan=>?case s=>s.toFloat}有不同的方法可以实现这一点,但是flatMap+empty Seq是我个人的选择。