【问题标题】:How to save spark dataframe that is not empty如何保存不为空的火花数据框
【发布时间】:2020-04-20 04:57:47
【问题描述】:

我们正在保存一个数据框,但我们需要检查该数据框不应该为空。

为了实现这一点,我们使用df.isEmpty(),这是保存 DF 时非常常见的做法。

我担心的是 df.isEmpty、head(1)、limit(1) 所有这些都会执行一个 Action,它将第一次执行整个计划,然后当我们 保存它将再次触发(执行)计划第二次。是不是很糟糕,有没有更好的方法呢?

在大多数代码示例中,我遇到的博客这是保存非空数据帧的常用方法 检查空(触发操作并执行计划),然后保存(触发操作并再次执行整个计划)

【问题讨论】:

  • df.isEmpty, head(1), limit(1) 是您得到的最佳选择。他们只会抢第一排,所以他们不会那么慢。

标签: scala apache-spark hadoop apache-spark-sql


【解决方案1】:

我不会使用 df.rdd.isEmpty。这种方法将数据帧转换为可能不利用底层优化器(催化剂优化器)并减慢进程的 rdd。

使用 count() 但一定要保留数据以避免不必要的计划执行。

dataframe.persist() // persist data in order to avoid redundant executions
if (dataframe.count() > 0) // first action. triggers plan
    dataframe
       .write
       .mode("overwrite")
       .format("desired.format")
       .save("foo/bar") // second action. due to previous persis(), plan will not be triggered
dataframe.unpersist() // unpersist it, data is no longer needed

希望对你有帮助

【讨论】:

  • 不管怎样,实际上这是一个难题。我不知道为什么人们坚持这一点,根本不担心这一切。那么如果一个空文件呢?
  • @thebluephantom 我不知道他为什么担心它。我只是以我所知道的最好的方式回答他的问题。
  • 如果我们有空文件,我们的下一个过程将失败。所以我们需要在调用 save 之前检查 DF 是否不为空
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多