簡體   English   中英

緩存Spark Dataframe以提高速度

[英]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_dfbase_df僅再使用base_df.join()結果。 這意味着base_df不被重用。

這是可以重用的示例:

base_df.join(df1, id_col)
base_df.join(df2, id_col)

但這不符合您的要求。 根據base_dflist_df的創建方式(可能如何創建),您可能需要考慮使用相同的分區程序對這些數據幀進行預分區-在這種情況下, join操作不會引起混洗,這將大大提高性能。

另一種方法是,如果list_dfs中的數據幀相對較小,則執行broadcast join

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM