2017-08-08 114 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被緩存,並且不需要註冊臨時表等。