【发布时间】:2018-11-01 16:03:59
【问题描述】:
根据这么多好的资源,建议在过滤操作后重新分区RDD。因为,现在大部分分区可能都是空的。 我怀疑是否在当前版本中处理了数据框,或者我们是否仍需要在过滤操作后重新分区?
【问题讨论】:
标签: apache-spark dataframe pyspark rdd
根据这么多好的资源,建议在过滤操作后重新分区RDD。因为,现在大部分分区可能都是空的。 我怀疑是否在当前版本中处理了数据框,或者我们是否仍需要在过滤操作后重新分区?
【问题讨论】:
标签: apache-spark dataframe pyspark rdd
我怀疑在当前版本中是否已经处理了数据框,或者我们是否仍需要在过滤操作后重新分区?
如果你问 Spark 是否自动重新分区数据,答案是否定的(我希望它在未来不会改变)
根据这么多好资源,建议过滤操作后重新分区RDD。因为,现在大部分分区可能都是空的。
这实际上取决于两个因素:
除非您期望谓词修剪大部分数据或先验分布会留下很大一部分分区为空,否则重新分区的成本通常会超过潜在的收益,因此调用repartition 的主要原因是限制输出文件的数量。
【讨论】:
我假设这是您的问题。
我应该在重新分区之前还是之后运行过滤操作?
基于此假设,过滤器将始终尝试查找符合某些条件的记录。因此,结果数据帧/RDD 总是小于或等于前一个数据帧/RDD。在大多数情况下,结果集小于前一个。
而 repartition 是最昂贵的操作之一,因为它会进行随机播放。永远记住,每当我们执行重新分区时,内存中的数据越少,我们可以从中获得的性能就越好。
我什至不必多谈 Spark 如何处理它等,在 重新分区前的通用过滤器对性能有好处!
例如,催化剂优化器本身使用前后过滤器来提高性能。
例如,Spark 知道如何以及何时执行合并等操作 过滤器,或在连接之前移动过滤器。 Spark 2.0 甚至允许您 定义、添加和测试您自己的附加优化规则 运行。 1[2]
【讨论】:
Spark 不会自动重新分区数据。如果您需要执行连接和聚合等操作,最好在过滤后重新分区数据。根据您的需要,您应该使用repartition 或coalesce。通常,coalesce 是可取的,因为它会尝试将数据组合在一起而不进行混洗,因此它只会减少分区数。 (good link for understanding coalesce and repartition)
如果您在过滤操作后不进行任何繁重的计算,则不会有很大的性能提升。请记住,重新分区本身也可能很昂贵。您必须了解您的数据才能做出该决定
【讨论】: