df.cache() 存储在哪里

shi*_*455 10 apache-spark apache-spark-sql

我想了解以下代码存储在哪个节点(驱动程序或工作程序/执行程序)中

df.cache() //df is a large dataframe (200GB)
Run Code Online (Sandbox Code Playgroud)

并且具有更好的性能:使用 sqlcachetablecache(). 我的理解是,其中一个是懒惰的,另一个是渴望的。

Sha*_*ala 8

df.cache()调用persist()在存储级别存储为 的方法MEMORY_AND_DISK,但您可以更改存储级别

persist()方法调用 sparkSession.sharedState.cacheManager.cacheQuery() 并且当您看到cacheTable它的代码时也会调用相同的 sparkSession.sharedState.cacheManager.cacheQuery()

这意味着两者是相同的并且被延迟评估(仅在执行操作时评估),除了persist方法可以存储为提供的存储级别,这些是可用的存储级别

  • 没有任何
  • DISK_ONLY
  • DISK_ONLY_2
  • MEMORY_ONLY
  • MEMORY_ONLY_2
  • MEMORY_ONLY_SER
  • MEMORY_ONLY_SER_2
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_2
  • MEMORY_AND_DISK_SER
  • MEMORY_AND_DISK_SER_2
  • OFF_HEAP

也可以使用CACHE TABLE不惰性求值的 SQL将整个表存储在内存中,这也可能导致OOM

总结: cache() , persist(),cacheTable()被懒惰地评估,需要执行一个动作才能在SQL CACHE TABLE渴望的地方工作

看到这里的细节

可以根据自己的需求选择!

希望这可以帮助!

  • @Shankar Koirala:当我说 df.cache() 或 persist() 时,我的问题更多是关于数据的存储位置?当我说它在单个工作节点或驱动程序节点上的内存中或跨节点分布等时。我确实理解有多个存储级别 (2认同)