【问题标题】:In Spark, how come we can broadcast a DataFrame but not a RDD? How do we use a broadcasted DataFrame?在 Spark 中,为什么我们可以广播 DataFrame 而不能广播 RDD?我们如何使用广播的 DataFrame?
【发布时间】:2018-08-09 20:49:22
【问题描述】:

我想知道为什么在 Spark 中我们不允许广播 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 的功能,以应对我必须通过涉及调用其他并行化集合的转换/动作的转换来对并行化集合进行操作的情况。

【问题讨论】:

  • df.select("id").rdd.map(r => r(0)).collect.toList 这种类型的事情是可能的 - 只是为了好衡量。

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


【解决方案1】:

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

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

本地DataFrames 甚至可以在任务中使用,尽管它没有被宣传 - Why does this Spark code make NullPointerException?

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

【讨论】:

  • 与 RDD 一样,DataFrame 是不可变的分布式数据集合。我不确定你是否已经解决了这个问题。
  • @thebluephantom 数据集(DataFrame)是一个更广泛的抽象。它不一定代表分布式对象(我上面提到的本地数据集,可能在不触发 Spark 作业的情况下进行处理)或集合(流数据集)。所以改为 DataFrame is ... 它应该是 DataFrame can be ...
  • databricks.com/blog/2016/07/14/… 是从 databricks 博客中获得的。我想我明白你的意思,但对我来说,它是在雾一般意义上分布的。感谢您的快速回复
  • 你说可以在本地运行,是指本地在驱动节点还是工作节点?或两者?如果您查看我上面的代码,广播的DataFrame 不能在外部RDD 转换中调用操作。
  • @JaneWayne 我会按照一般意义上的预期使用这些东西。广播是针对小数据的,大的还有其他方面。我认为他的意思是两者兼而有之。人们总是谈论司机,但他们也不知不觉地意味着工人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多