如何使用Spark SQL广播功能

时间:2018-02-27 03:03:55

标签: apache-spark

Spark SQL提供了一个函数broadcast来指示数据集足够小并且应该广播

def broadcast[T](df: Dataset[T]): Dataset[T] = {
  Dataset[T](df.sparkSession,
      ResolvedHint(df.logicalPlan, HintInfo(broadcast = true)))(df.exprEnc)
}

我知道我可以通过以下方式使用它:

val a = spark.range(100).as("a")
val b = spark.range(100).as("b")
val df = a.join(broadcast(b)).where($"a.id" === $"b.id")

我想在SQL语句中使用它,如:

spark.range(100).createOrReplaceTempView("a")
spark.range(100).createOrReplaceTempView("b")

val df = spark.sql("select a.id, c.id from a join broadcast(b)  c on a.id = c.id")

但它引发了一个例外:

cannot resolve '`b`' given input columns: []

看起来SQL像列一样对待b?我会问我如何在SQL语句中使用broadcast函数。

2 个答案:

答案 0 :(得分:1)

对于SQL,select /*+ BROADCASTJOIN(b) */a.id, b.id from a join b on a.id = b.id用于指示要广播的数据集b。

答案 1 :(得分:0)

您案例的简单工作代码将是

val a = spark.range(100).as("a")
val b = spark.sparkContext.broadcast(spark.range(100).as("b"))
val df = a.join(b.value, Seq("id"))

使用 SparkContext的广播功能,其定义为

  
    

向集群广播一个只读变量,返回一个     [[org.apache.spark.broadcast.Broadcast]]用于在分布式函数中读取它的对象。     该变量将仅发送到每个集群一次。     @param值要广播到Spark节点     @return Broadcast对象,一个在每台机器上缓存的只读变量