2017-09-01 96 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) 

注意,例如易挥发,在同步块被初始化。