[英]Caching Spark Dataframe for speed enhancement
我有一個將數據框列表連接到基本數據框並返回數據框的函數。 我正在嘗試減少此操作所需的時間。 由於我是使用基本數據幀多次加入的,因此我對其進行了緩存,但運行時仍然相似。 這是我正在使用的功能
def merge_dataframes(base_df, df_list, id_col):
"""
Joins multiple dataframes using an identifier variable common across datasets
:param base_df: everything will be added to this dataframe
:param df_list: dfs that have to be joined to main dataset
:param id_col: the identifier column
:return: dataset with all joins
"""
base_df.persist(StorageLevel.MEMORY_AND_DISK)
for each_df in df_list:
base_df = base_df.join(each_df, id_col)
base_df.unpersist()
return base_df
緩存后獲得類似結果令我感到驚訝。 這背后的原因是什么,我該怎么做才能減少時間。
另外,由於我當前使用的數據集相對較小(約5萬條記錄),因此只要需要對數據集進行高速緩存,我在需要的時候緩存數據集就不會有問題。
連接是一種轉換-此時不觸發任何計算
第一:
您在執行操作之前unpersist()
。
嘗試刪除不unpersist
並查看會發生什么。
第二:
恐怕在您的情況下,您不能從持久性中受益,因為在您的代碼中編寫的內容與以下內容相同:
base_df.join(df1, id_col).join(df2, id_col).join(df3, id_col)...
在這種情況下, base_df
計算一次base_df
, base_df
僅再使用base_df.join()
結果。 這意味着base_df
不被重用。
這是可以重用的示例:
base_df.join(df1, id_col)
base_df.join(df2, id_col)
但這不符合您的要求。 根據base_df
和list_df
的創建方式(可能如何創建),您可能需要考慮使用相同的分區程序對這些數據幀進行預分區-在這種情況下, join
操作不會引起混洗,這將大大提高性能。
另一種方法是,如果list_dfs中的數據幀相對較小,則執行broadcast join
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.