可以說,我從驅動器廣播的變量如下:如何檢查廣播變量在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)
注意,例如易揮發,在同步塊被初始化。