数据岗位面试题更新 2026-08-05

在 PySpark 中,RDD.cache() 与 DataFrame.cache() 的运作机制有何不同?请结合各自的使用场景说明,并比较两者在性能和适用性上的差异。

数据性能优化技术原理方案权衡PySpark

考察说明

考查对 PySpark 中 RDD 与 DataFrame 缓存机制的理解,以及根据场景选择缓存方式的能力。

回答思路

  1. 【回答框架 1】RDD.cache() 将 RDD 的全部数据以 JVM 对象形式存储在 executor 内存中,默认使用 MEMORY_ONLY 级别,若内存不足则部分分区不会被缓存,在后续计算时重新计算。DataFrame.cache() 同样默认使用 MEMORY_ONLY,但数据以列式存储的二进制格式(Tungsten 格式)存放,内存占用更紧凑,并支持谓词下推等优化。
  2. 【回答框架 2】RDD 缓存适合需要多次重用且无法利用 DataFrame 优化(如自定义复杂函数或非结构化数据)的场景。DataFrame.cache() 适合结构化或半结构化数据,在重复查询、迭代计算或多轮交互式分析中能减少 Shuffle 和 I/O 开销,性能通常优于 RDD 缓存。
  3. 【回答框架 3】在 PySpark 中,DataFrame 底层也是基于 RDD,但缓存时执行计划不会立即触发计算,只有遇到 Action 时才会真正缓存数据;RDD 同理。触发缓存后,后续的 Action 会直接从缓存读取数据,避免重新计算血缘依赖。
  4. 【回答框架 4】缓存数据可能占用大量内存,若内存不足会溢写磁盘(若设置了 MEMORY_AND_DISK 级别),但默认 MEMORY_ONLY 会因数据丢失而重算。因此需要根据数据大小与资源情况,选择适当的存储级别,并在不再使用时调用 unpersist() 释放内存。
  5. 【关键点 1】两者默认缓存级别均为 MEMORY_ONLY,但 DataFrame 采用列式二进制存储,内存效率更高。
  6. 【关键点 2】DataFrame.cache() 可受益于 Catalyst 优化器,适用于结构化数据的重复查询;RDD.cache() 更灵活,适合非结构化和自定义计算。
  7. 【关键点 3】缓存是惰性的,只有 Action 触发后才会实际缓存数据。
  8. 【易错点 1】误以为只调用 cache() 就会立即缓存,而未触发 Action 导致缓存未生效。
  9. 【易错点 2】忽略默认 MEMORY_ONLY 级别在内存不足时可能丢失缓存数据从而重算,未合理设置存储级别或进行持久化。
  10. 【易错点 3】对所有结果无差别 cache,导致内存压力过大,未及时 unpersist 造成资源浪费。