让我说我从驱动程序广播变量如下:
var r = sc.broadcast(s)
我正在工作人员那里访问:
r.value
有时上面的命令r.value
导致空指针前进(
java.lang.NullPointerException
)
为了避免这种情况,我需要知道广播是否成功,以便我可以继续使用值r.value。有人可以帮我理解如何实现这个目标吗?
答案 0 :(得分:1)
一般来说,这不应该发生(并且应该报告为错误),除非您使用带有检查点的流式传输。在此上下文中,您应该按照provided in the documentation的说明(从那里复制的示例):
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)
请注意,实例是易失性的,并在同步块中初始化。
答案 1 :(得分:0)
您可以使用以下方法之一来使用空指针异常:
1.pattern matching
val result = r.value match {
case null => "empty"
case s => s
}
2.Option
val result = Option(r.value).getOrElse("empty")
答案 2 :(得分:0)
您可以使用scala的Try
类
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
,则返回0。