我想知道为什么不允许我们广播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功能的方法。
答案 0 :(得分:3)
这是因为DataFrame
不一定是分布式的。如果仔细检查,您会发现Dataset
提供了isLocal
的方法:
如果collect和take方法可以在本地运行(没有任何Spark执行程序),则返回true。
本地DataFrames
甚至可以在任务-Why does this Spark code make NullPointerException?
广播Dataset
使用类似的机制-它收集数据以创建本地对象,然后进行广播。因此,它只不过是collect
后跟broadcast
的语法糖(为了避免转换为外部格式,它使用比collect
更复杂的方法)与RDD
。