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
函数。
答案 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
对象,一个在每台机器上缓存的只读变量