緩存()是一個Apache火花DataFrame轉換,可以使用,數據集或抽樣當您想要執行多個操作。緩存()緩存指定DataFrame、數據集或集群抽樣的記憶你的工人。自緩存()是一個變換,緩存操作發生隻有當火花操作(例如,count (),顯示(),帶(),或write ())也用於DataFrame相同,數據集或抽樣在一個單一的行動。
分別調用緩存()和數量()
% scala df1 = spark.read.parquet (input_path1) df2 = spark.read.parquet (input_path2) df1.cache() #緩存DataFrame df1 joined_df = df1。加入(df2 df1.id = = df2。id、“內在”)#加入DataFrame df1和df2 filtered_df = joined_df。過濾器(" name = =約翰”)#過濾器名稱“約翰”的加入DataFrame df1.count() #調用數()緩存DataFrame filtered_df.show() #顯示過濾DataFrame filtered_df
在這個例子中,DataFramedf1緩存到內存時df1.count ()是執行。df1.cache ()不啟動DataFrame緩存操作嗎df1。
調用緩存DataFrame帶()
% scala df = spark.table (input_table_name) df.cache.take(5) #叫帶(5)DataFrame df,同時還可以緩存它df.count() #調用計數DataFrame df ()
在這個例子中,DataFramedf緩存到內存時(5)是執行。隻有一個分區的DataFramedf在這種情況下,緩存,因為(5)隻有流程5條記錄。隻有記錄的分區處理,且僅處理分區的緩存。其他分區的DataFramedf也不會被緩存。
因此,當df.count ()被調用時,DataFramedf再次創建,因為隻有一個分區可用集群的緩存。
調用(5)在這個示例中隻緩存DataFrame的14%。
緩存DataFrame調用數()
% scala df = spark.table (input_table_name) df.cache.count() #調用計數DataFrame df(),同時還可以緩存它df.count() #調用數()DataFrame df df.filter (" name = =約翰”).count ()
在這個例子中,DataFramedf緩存到內存時df.count ()是執行。返回dataframe的計數,處理所有的分區。這意味著所有的緩存分區。
因此,當df.count ()和df.filter (" name = =約翰”).count ()DataFrame,稱為後續行動嗎df獲取集群的緩存,而不是被重新創建。
調用count ()在這個例子中緩存DataFrame的100%。
總結
你應該叫count ()或write ()後立即調用緩存()這樣整個DataFrame處理和緩存在內存中。如果你隻緩存DataFrame的一部分,整個DataFrame可能重新計算當DataFrame執行後續操作。