Spark程序的Map函数中的空指针异常

问题描述 投票:-2回答:2

我是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)

scala dictionary apache-spark nullpointerexception
2个回答
0
投票

我想在输入数据中至少有一行不包含第10列中的值,因此line.getString(10)返回null。在该结果上调用replaceAll(",","")时,会发生NullPointerException。

快速修复将在getString中包含对Option的调用:

val population = Option(line.getString(10)).getOrElse("")

如果列为null,则返回第10列的值或空字符串。

解析long时必须小心。除非您完全确定该列始终包含数字,否则可能会引发NumberFormatException

通常,您应该检查Spark的CSV阅读器的inferSchema option,并尽量避免自己解析数据。


0
投票

除了本文其他地方提到的解析问题之外,您的数据中似乎还有逗号分隔的数字。这将使csv解析复杂化并导致潜在的不良行为。您甚至可以在阅读spark之前清理数据。

此外,如果您使用的是Spark 2.0,最好使用Dataframes / Datasets以及GroupBy构造。看到这篇文章 - How to deal with null values in spark reduceByKey function?。我怀疑你的排序键中也有空值。

© www.soinside.com 2019 - 2024. All rights reserved.