【问题标题】:Spark Repeating `DataFrame` Processing Work?Spark重复“DataFrame”处理工作?
【发布时间】:2017-02-01 16:11:23
【问题描述】:

我正在使用 Apache Spark (1.6) 执行 ML 任务,我注意到 Spark 似乎正在对单个 DataFrame 重复处理。

我的代码如下所示:

val df1 = sqlContext.read.parquet("data.parquet")

val df2 = df1.withColumn("new", explode(expensiveTextProcessing($"text"))

println(df2.count)

... (no changes to df2)

println(df2.count)

所以我知道我的withColumn 是一个转换,count 是一个动作,所以count 看起来像是更长的操作。

但是,我注意到第二次运行 df2.count 所用的时间与第一次运行 df2.count 一样长。此外,我正在使用的 NLP 工具在 expensiveTextProcessing 期间会引发一些警告,并且这些警告会在 bothcount 调用期间显示。

每次我使用df2 中的数据时,Spark 是否都会执行所有expensiveTextProcessing 操作?

(有关更多上下文,您可以查看我的实际 Jupyter Notebook here

【问题讨论】:

  • 您是否尝试过在任何时候持久化数据帧?如果没有,您为什么希望它更快?
  • 嗯,如果我不使用persist,那么所有为count 所做的工作都会被丢弃?这是我不知何故错过的一个非常重要的一点......
  • 我的意思是,count() 是一个动作,是的。转换是懒惰的。即使您没有修改数据框,计数仍然需要收集所有记录
  • 有时数据存储在内存缓存中,但这不是您可以依赖的任何容量

标签: scala apache-spark


【解决方案1】:

像 RDD 这样的 DataFrame 具有用于在动作调用期间构建结果 DataFrame 的血统。当您调用 count 时,所有执行程序的结果都会收集到驱动程序。您可以检查 Spark Web UI DAG 表示和 DataFrame 的暂存以及进程的持续时间和本地化,以实现转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 2020-07-30
    • 1970-01-01
    • 2016-02-22
    • 2018-10-24
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多