在Spark中,为什么我们可以广播DataFrame但不能广播RDD?我们如何使用广播的DataFrame?

时间:2018-08-09 00:24:23

标签: apache-spark apache-spark-sql rdd

我想知道为什么不允许我们广播RDD,但是我们可以广播DataFrame

val df = Seq(("t","t"),("t","f"),("f","t"),("f","f")).toDF("x1", "x2")
val rdd = df.rdd
val b_df = spark.sparkContext.broadcast(df) //you can do this!
val b_rdd = spark.sparkContext.broadcast(rdd) //IllegalArgumentException!

广播的DataFrame的用途是什么? I know that we cannot operate on a RDD within another RDD transformation,但也禁止在RDD转换中尝试对DataFrame进行操作。

rdd.map(r => b_df.value.count).collect //SparkException

在试图通过涉及调用其他并行化集合的转换/动作的转换对并行化集合进行操作的情况下,我试图找到利用Spark功能的方法。

1 个答案:

答案 0 :(得分:3)

这是因为DataFrame不一定是分布式的。如果仔细检查,您会发现Dataset提供了isLocal的方法:

  

如果collect和take方法可以在本地运行(没有任何Spark执行程序),则返回true。

本地DataFrames甚至可以在任务-Why does this Spark code make NullPointerException?

中使用,尽管它没有广告

广播Dataset使用类似的机制-它收集数据以创建本地对象,然后进行广播。因此,它只不过是collect后跟broadcast的语法糖(为了避免转换为外部格式,它使用比collect更复杂的方法)与RDD