,说我从驱动程序中广播一个变量如下:
var r = sc.broadcast(s)
我正在工人访问同样的东西:
r.value
有时上方命令r.value
会导致无效指针投入( java.lang.NullPointerException
)
避免我需要知道广播是否成功,以便我可以继续进行R.Value。有人可以帮助我了解如何实现吗?
一般来说,这不应该发生(应该报告为错误),除非您将流式传输与检查点。在这种情况下,您应该遵循文档中提供的说明(从那里复制的示例):
object WordBlacklist {
@volatile private var instance: Broadcast[Seq[String]] = null
def getInstance(sc: SparkContext): Broadcast[Seq[String]] = {
if (instance == null) {
synchronized {
if (instance == null) {
val wordBlacklist = Seq("a", "b", "c")
instance = sc.broadcast(wordBlacklist)
}
}
}
instance
}
}
...
val blacklist = WordBlacklist.getInstance(rdd.sparkContext)
请注意,实例是挥发性的,并在同步块中初始化。
您可以使用下面描述的一种方法来骑Null指针异常:
1.pattern匹配
val result = r.value match {
case null => "empty"
case s => s
}
2.Option
val result = Option(r.value).getOrElse("empty")
您可以使用Scala的Try
class
import scala.util.{Try, Success, Failure}
// Suppose you have broadcasted an Int
val bval = Try(broadcastVar.value) match {
case Success(v) => v
cast Failure(e) => 0
}
如果操作为Success
,则将返回原始值,如果结果为Failure
。