繁体   English   中英

scala map over rdd ERROR java.lang.NullPointerException

[英]scala map over rdd ERROR java.lang.NullPointerException

当我尝试通过从 HDFS 读取的 rdds 尝试 map 时,我遇到了一个奇怪的错误,这是我的代码(简化)。

我尝试将 RDD 放入 scala Map 然后 select 某些键值写入 Z99C60350FF7CF7E3Z3。 我在下面运行了这段代码,但每次运行到“map over rdd”过程(我在下面发表了评论)时,我遇到了 NPE Error ,太奇怪了!

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

顺便说一句:我使用的所有键都存在于 scala Map 中,并且没有 null 值。 我删除了“map over 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中返回null所致。 RDD.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 来自的地方: link 只需删除此null返回并将其替换为空的迭代即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM