2017-09-01 93 views
0

可以說,我從驅動器廣播的變量如下:如何檢查廣​​播變量在Spark 2.0中是否有效?

var r = sc.broadcast(s) 

我訪問相同的工人:

r.value 

有時上述命令r.value導致空指針厚望( java.lang.NullPointerException

爲了避免這種情況,我需要知道廣播是否成功,以便我可以繼續處理值r.value。有人能幫助我理解如何實現嗎?

回答

0

你可以騎在下面描述的方法之一的使用空指針異常:

1.pattern匹配

val result = r.value match { 
     case null => "empty" 
     case s => s 
    } 

2.Option

val result = Option(r.value).getOrElse("empty") 
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。

1

一般情況下,這應該不會發生(並應報告爲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) 

注意,例如易揮發,在同步塊被初始化。