可以说,我从驱动器广播的变量如下:如何检查广播变量在Spark 2.0中是否有效?
var r = sc.broadcast(s)
我访问相同的工人:
r.value
有时上述命令r.value
导致空指针厚望( java.lang.NullPointerException
)
为了避免这种情况,我需要知道广播是否成功,以便我可以继续处理值r.value。有人能帮助我理解如何实现吗?
可以说,我从驱动器广播的变量如下:如何检查广播变量在Spark 2.0中是否有效?
var r = sc.broadcast(s)
我访问相同的工人:
r.value
有时上述命令r.value
导致空指针厚望( java.lang.NullPointerException
)
为了避免这种情况,我需要知道广播是否成功,以便我可以继续处理值r.value。有人能帮助我理解如何实现吗?
你可以骑在下面描述的方法之一的使用空指针异常:
1.pattern匹配
val result = r.value match {
case null => "empty"
case s => s
}
2.Option
val result = Option(r.value).getOrElse("empty")
您可以使用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。
一般情况下,这应该不会发生(并应报告为bug),除非您使用带检查点的流。在这种情况下,你应该按照说明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)
注意,例如易挥发,在同步块被初始化。