2017-08-08 220 views
0

想了解在哪个节点(驾驶员或工人/执行人)存储器做以下代码存储哪里df.cache()存储

df.cache() //df is a large dataframe (200GB) 

而这是更好的性能在SQL cachetable之间使用或cache() dataframe.my理解是其中之一是懒惰,另一个是渴望。

回答

2

df.cache()调用persist()方法存储在存储级别MEMORY_AND_DISK,但你可以改变存储级别

persist()方法调用 sparkSession.sharedState.cacheManager.cacheQuery() ,当你看到代码cacheTable它也调用相同 sparkSession.sharedState.cacheManager.cacheQuery()

这意味着二者都是相同的,并且是懒惰地评估(只计算一次共同行动执行n)时,除了persist方法可以作为提供的存储级存储,这些是可用的存储电平

  • NONE
  • 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

您也可以使用SQL CACHE TABLE未懒洋洋地评估和存储整个表在内存中,这也可能导致OOM

摘要:cache(),persist(),cacheTable()是懒惰评估,需要执行的行动,因为SQL CACHE TABLE渴望

请参阅这里details

您可以根据您的要求选择!

希望这会有所帮助!

+0

略低不正确,因为dataframes'cache'和默认'persist'是'MEMORY_AND_DISK' – philantrovert

+0

非常感谢@philantrovert我已经改正了:) –

+0

@Shankar柯伊拉腊:我的问题是更多的对数据存储的位置,当我说DF .cache()或persist()?当我说在单个工作节点或驱动程序节点上的内存或分布在各个节点上的内容等时。我确实知道存在多个存储级别 – shiv455

0

cache(或persist)方法标记数据帧用于在存储器缓存(或磁盘,如果需要,作为其他回答说),但是这一点,并且仅在一个懒惰发生仅在数据帧执行的动作一次时尚,也就是说,如果您最终只读取100行,则只有那100行被缓存。创建临时表并使用cacheTable迫切希望它立即缓存整个表。哪一个更高性能取决于你的情况。我用普通的DataFrame cache完成的一件事就是立即调用.count(),强制DataFrame被缓存,并且不需要注册临时表等。