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



,说我从驱动程序中广播一个变量如下:

var r = sc.broadcast(s)

我正在工人访问同样的东西:

r.value

有时上方命令r.value会导致无效指针投入( java.lang.NullPointerException

避免我需要知道广播是否成功,以便我可以继续进行R.Value。有人可以帮助我了解如何实现吗?

一般来说,这不应该发生(应该报告为错误),除非您将流式传输与检查点。在这种情况下,您应该遵循文档中提供的说明(从那里复制的示例):

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)

请注意,实例是挥发性的,并在同步块中初始化。

您可以使用下面描述的一种方法来骑Null指针异常:

1.pattern匹配

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

2.Option

  val result = Option(r.value).getOrElse("empty")

您可以使用Scala的Try class

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

相关内容

  • 没有找到相关文章

最新更新