PySpark采样DataFrame计数耗时未降低原因及内存优化疑问
采样count与全量count耗时相近的原因及内存优化分析
耗时相近的核心原因
- Spark的
sample(withReplacement=False, fraction=0.1)操作必须遍历全量数据:无放回采样需要对每个分区的每条数据做随机筛选判断,这个过程的IO和计算开销和全量count()几乎一模一样——本质上都是把所有数据读一遍。 - 你观察到的总耗时里,
sample步骤已经占了绝大部分时间,后续sampled_df.count()只是统计采样后那10%的数据,耗时可以忽略,所以整体耗时和直接全量count差不了多少。 - 如果你的DataFrame没提前缓存,两次操作都是从头读取原始数据源,进一步拉平了耗时差距。
内存使用的实际表现
- 采样过程中:内存峰值和全量count基本一致,因为采样时每个executor都要加载自己负责的全量分区数据,筛选出采样部分后才会释放原数据内存,这一步的内存压力和全量count相同。
- 采样完成后:如果后续要复用
sampled_df,它在内存中只保留10%的数据,内存占用会比全量DataFrame低很多;但如果只是采样后立即count,采样完成后count操作很快,内存会快速回收,整体平均内存占用略低于全量count,但峰值差异不大。
内容的提问来源于stack exchange,提问作者Ajayv
相关产品推荐
相关产品推荐

