【发布时间】:2020-09-28 09:23:43
【问题描述】:
当我尝试映射从 HDFS 读取的 rdds 时遇到一个奇怪的错误,这是我的代码(简化)。
我尝试将 RDD 放入 Scala Map,然后选择某些键值来写入 HDFS。我在下面运行了这段代码,但是每次运行到“map over rdd”过程(我在下面做了评论),我遇到了 NPE 错误,太奇怪了!
我无法解决这个问题。我以一种笨拙而丑陋的方式重写了我的代码以使其工作,但我仍然想知道为什么“映射超过 rdd”很重要!!!
顺便说一句: 我使用的所有键都存在于 scala 映射中,并且没有空值。我删除了“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)
【问题讨论】:
-
为什么你甚至返回 null 呢?你在
flatMap,只返回一个空列表 -
是的,但这是一个不会使代码失败的细节:(
-
你确定不会吗?在
flatMap中返回null势必会带来麻烦。您可能还想发布有效的代码以及异常的堆栈跟踪。 -
其实你们是完全正确的!代码所有者,不是我,写了代码放到网上,现在想知道这段代码是运行了很久还是失败了很久:-P
标签: java scala apache-spark rdd