scala map over rdd ERROR java.lang.NullPointerException



当我尝试映射从HDFS读取的rdd时,我遇到了一个奇怪的错误,这是我的代码(简化(。

我尝试将RDD放入scala Map中,然后选择某些键值来编写HDFS。我运行了下面的代码段,但每次它运行到"映射 rdd"进程(我在下面发表了评论(时,我都遇到了 NPE 错误,这太奇怪了!

我无法解决这个问题。我以一种笨拙而丑陋的方式重写了我的代码来使其工作,但我仍然想知道为什么"在rdd上的映射"很重要!!

顺便说一句: 我使用的所有键都存在于 scala Map 中,并且没有空值。我删除了"映射 rdd"过程并将键值写入字符串以使我的代码以另一种方式工作,但只是渴望知道为什么会发生这个奇怪的问题......T_T

val featureRdd = hdfsRDD
.flatMap { item =>
val result = new ArrayBuffer[String]()
val itemInfo = collection.mutable.Map[String, String]()
// x below is a string tuple: (s1, s2, s3)
item._2.asScala.foreach(x => {
itemInfo.put(x._2, x._3)
})
val f1 = itemInfo.getOrElse("f1", "")
val f2 = itemInfo.getOrElse("f2", "")
if (f1.equals("true") && f2.nonEmpty) {
val c1 = itemInfo.getOrElse("c1", "0")
val c2 = itemInfo.getOrElse("c2", "0")
val featureInfo = collection.mutable.Map[String, String]()
featureInfo.put("c1", c1)
featureInfo.put("c2", c2)
// Every time I add this map code, I will get NPE ERROR
// And I'm sure this is no null values because I filter all null values ahead of time
featureInfo.map(item => {
val featureName = item._1
val featureValue = item._2
result += List(featureName, featureValue).mkString(",")
})
result
} else {
null
}
}.filter(_!=null)

这显然是由于在您的flatMap中返回nullRDD.flatMap遵从Iterator.flatMap,并检查一下:

println(List(List(1), null).iterator.flatMap(identity).toList) // throws NPE
Exception in thread "main" java.lang.NullPointerException
at scala.collection.Iterator$$anon$11.nextCur(Iterator.scala:480)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:486)
at scala.collection.Iterator.foreach(Iterator.scala:937)
at scala.collection.Iterator.foreach$(Iterator.scala:937)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1425)
at scala.collection.generic.Growable.$plus$plus$eq(Growable.scala:58)
at scala.collection.generic.Growable.$plus$plus$eq$(Growable.scala:49)
at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:185)
at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:43)
at scala.collection.TraversableOnce.to(TraversableOnce.scala:309)
at scala.collection.TraversableOnce.to$(TraversableOnce.scala:307)
at scala.collection.AbstractIterator.to(Iterator.scala:1425)
at scala.collection.TraversableOnce.toList(TraversableOnce.scala:293)
at scala.collection.TraversableOnce.toList$(TraversableOnce.scala:293)
at scala.collection.AbstractIterator.toList(Iterator.scala:1425)
at com.dici.collection.ScalaArrayUtils$.main(ScalaArrayUtils.scala:22)
at com.dici.collection.ScalaArrayUtils.main(ScalaArrayUtils.scala)

更具体地说,这就是我希望您的NPE的来源:链接。 只需删除此null返回并将其替换为空的可迭代对象即可。

相关内容

最新更新