【问题标题】:Does Spark recompute dataframes after a showSpark 会在演出后重新计算数据帧吗
【发布时间】:2019-11-27 18:27:58
【问题描述】:

我很好奇 Spark 如何处理计算阶段。

我可以举几个例子:

val df1 = stage1(df)
val df2 = stage2(df1)
df2.show(10)
val df3 = stage3(df2)

Spark 如何在这里处理show?它是否计算stage1stage2 两次,一次用于演出,一次用于stage3。这意味着 show() 会减慢进程

用户是否可以控制持久化和不持久化的内容?

提前致谢!

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    显示是一个动作。假设stage3之后有一个Action,那么就会发生重新计算。

    如果没有演出,那就没有。

    在 df2 上缓存意味着在您的示例中无需重新计算,特别是。

    【讨论】:

    • 您是说如果stage3 之后有操作,df2 将重新计算两次。你推荐使用df.persist(StorageLevel.MEMORY_AND_DISK_SER) 来坚持吗?
    • 是的。你可以这样做,我使用 .cache。真正要考虑的是,如果动作是并发执行的,但尚未尝试过,会发生什么。但我怀疑需要 .cache 或等效项。
    • 酷。谢谢。我很惊讶 Spark 不能更有效地处理计算。
    • 好点,请参阅stackoverflow.com/questions/26870537/…,可能会接受答案。
    • @thebluephantom 它被归类为一个动作,是的,但它的行为方式与其他动作不同。如果您执行val foo = spark.read.parquet("file.parquet").cache(),然后您执行foo.show(),则只有部分foo 被缓存,因为show() 不会对整个DataFrame 执行操作。所以,是的,你是对的。这是一个动作,但val foo = spark.read.parquet("file.parquet").cache().count() 将导致整个数据帧被缓存。 .show() 没有这样做,我觉得你回答问题的方式并没有阐明那个非常重要的区别。
    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多