Spark程序的Map函数中的空指针异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark程序的Map函数中的空指针异常相关的知识,希望对你有一定的参考价值。
我是Scala的新手,在运行一个spark程序时,我得到了null指针异常。任何人都可以指出我如何解决这个问题。
val data = spark.read.csv("C:\File\Path.csv").rdd
val result = data.map{ line => {
val population = line.getString(10).replaceAll(",","")
var popNum = 0L
if (population.length()> 0)
popNum = Long.parseLong(population)
(popNum, line.getString(0))
}}
.sortByKey(false)
.first()
//spark.sparkContext.parallelize(Seq(result)).saveAsTextFile(args(1))
println("The result is: "+ result)
spark.stop
错误信息 :
引起:java.lang.NullPointerException 在com.nfs.WBI.KPI01.HighestUrbanPopulation $$ anonfun $ 1.apply(HighestUrbanPopulation.scala:23) 在com.nfs.WBI.KPI01.HighestUrbanPopulation $$ anonfun $ 1.apply(HighestUrbanPopulation.scala:22) 在scala.collection.Iterator $$ anon $ 11.next(Iterator.scala:410)
我想在输入数据中至少有一行不包含第10列中的值,因此line.getString(10)
返回null
。在该结果上调用replaceAll(",","")
时,会发生NullPointerException。
快速修复将在getString
中包含对Option
的调用:
val population = Option(line.getString(10)).getOrElse("")
如果列为null
,则返回第10列的值或空字符串。
解析long时必须小心。除非您完全确定该列始终包含数字,否则可能会引发NumberFormatException
。
通常,您应该检查Spark的CSV阅读器的inferSchema option,并尽量避免自己解析数据。
除了本文其他地方提到的解析问题之外,您的数据中似乎还有逗号分隔的数字。这将使csv解析复杂化并导致潜在的不良行为。您甚至可以在阅读spark之前清理数据。
此外,如果您使用的是Spark 2.0,最好使用Dataframes / Datasets以及GroupBy构造。看到这篇文章 - How to deal with null values in spark reduceByKey function?。我怀疑你的排序键中也有空值。
以上是关于Spark程序的Map函数中的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章
joda DateTime 格式导致 Spark RDD 函数中的空指针错误
方法 oncreateview 中片段中 listview.setadapter() 的空指针异常