【问题标题】:Spark Dataframe needs to be repartition after filter like RDD?Spark Dataframe需要像RDD这样的过滤器后重新分区?
【发布时间】:2018-11-01 16:03:59
【问题描述】:

根据这么多好的资源,建议在过滤操作后重新分区RDD。因为,现在大部分分区可能都是空的。 我怀疑是否在当前版本中处理了数据框,或者我们是否仍需要在过滤操作后重新分区?

【问题讨论】:

    标签: apache-spark dataframe pyspark rdd


    【解决方案1】:

    我怀疑在当前版本中是否已经处理了数据框,或者我们是否仍需要在过滤操作后重新分区?

    如果你问 Spark 是否自动重新分区数据,答案是否定的(我希望它在未来不会改变)

    根据这么多好资源,建议过滤操作后重新分区RDD。因为,现在大部分分区可能都是空的。

    这实际上取决于两个因素:

    • 过滤器的选择性如何(预期保留的记录比例是多少)。
    • 在过滤之前,关于谓词的数据分布是什么。

    除非您期望谓词修剪大部分数据或先验分布会留下很大一部分分区为空,否则重新分区的成本通常会超过潜在的收益,因此调用repartition 的主要原因是限制输出文件的数量。

    【讨论】:

    • 在 pyspark 中有什么方法可以知道哪些分区是空的,或者有什么方法可以知道分区的结构来决定是否需要重新分区或合并?
    • 我不知道。请记住,在处理数据之前,Spark 无法“知道”,并且在处理数据时,已经计算了执行计划。也许在未来,有增量计划和更好的基于成本的优化器,但不是现在......
    【解决方案2】:

    我假设这是您的问题。

    我应该在重新分区之前还是之后运行过滤操作?

    基于此假设,过滤器将始终尝试查找符合某些条件的记录。因此,结果数据帧/RDD 总是小于或等于前一个数据帧/RDD。在大多数情况下,结果集小于前一个。

    repartition 是最昂贵的操作之一,因为它会进行随机播放。永远记住,每当我们执行重新分区时,内存中的数据越少,我们可以从中获得的性能就越好。

    我什至不必多谈 Spark 如何处理它等,在 重新分区前的通用过滤器对性能有好处!

    例如,催化剂优化器本身使用前后过滤器来提高性能。

    Blog Link:

    例如,Spark 知道如何以及何时执行合并等操作 过滤器,或在连接之前移动过滤器。 Spark 2.0 甚至允许您 定义、添加和测试您自己的附加优化规则 运行。 1[2]

    【讨论】:

      【解决方案3】:

      Spark 不会自动重新分区数据。如果您需要执行连接和聚合等操作,最好在过滤后重新分区数据。根据您的需要,您应该使用repartitioncoalesce。通常,coalesce 是可取的,因为它会尝试将数据组合在一起而不进行混洗,因此它只会减少分区数。 (good link for understanding coalesce and repartition)

      如果您在过滤操作后不进行任何繁重的计算,则不会有很大的性能提升。请记住,重新分区本身也可能很昂贵。您必须了解您的数据才能做出该决定

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-02
        • 2019-06-13
        • 2019-07-16
        • 1970-01-01
        • 2020-03-11
        • 2020-12-14
        • 2015-06-27
        • 1970-01-01
        相关资源
        最近更新 更多