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() 的空指针异常

构造函数中的变量初始化速度不够快,无法防止 html 代码中的空指针异常 [Angular]

setText时的空指针异常 - TextView [复制]