如何在Spark 2.0中检查广播变量是否有效?

时间:2017-09-01 09:08:10

标签: apache-spark spark-dataframe

让我说我从驱动程序广播变量如下:

var r = sc.broadcast(s)

我正在工作人员那里访问:

r.value

有时上面的命令r.value导致空指针前进(     java.lang.NullPointerException

为了避免这种情况,我需要知道广播是否成功,以便我可以继续使用值r.value。有人可以帮我理解如何实现这个目标吗?

3 个答案:

答案 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。