Python 缓存Spark数据帧以提高速度
我有一个函数,它将一个数据帧列表连接到一个基本数据帧,并返回一个数据帧。我正在努力减少这次行动所需的时间。因为我使用基本数据帧多次加入,所以我缓存了它,但运行时仍然类似。这就是我正在使用的函数Python 缓存Spark数据帧以提高速度,python,apache-spark,dataframe,pyspark,apache-spark-sql,Python,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,我有一个函数,它将一个数据帧列表连接到一个基本数据帧,并返回一个数据帧。我正在努力减少这次行动所需的时间。因为我使用基本数据帧多次加入,所以我缓存了它,但运行时仍然类似。这就是我正在使用的函数 def merge_dataframes(base_df, df_list, id_col): """ Joins multiple dataframes using an identifier variable common across datasets :param base
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
我很惊讶在缓存之后得到了类似的结果。这背后的原因是什么?我能做些什么来减少时间消耗
另外,由于我目前使用的数据集相对较小(约50k条记录),因此只要我对数据集进行解缓存,就不会在需要时缓存数据集 连接是一种转换-此时不会触发任何计算 第一名: 您可以在操作之前取消持久化() 尝试删除
取消持久化
,看看会发生什么
秒:
在您的情况下,恐怕无法从持久性中获益,因为在代码中编写的内容与以下内容相同:
base_df.join(df1, id_col).join(df2, id_col).join(df3, id_col)...
在这种情况下,base_df
只计算一次,之后只进一步使用base_df.join()的结果。这意味着base\u df
不会被重用
以下是重复使用的示例:
base_df.join(df1, id_col)
base_df.join(df2, id_col)
但这不符合你的要求。
取决于如何<代码> BaseDFF 和 ListyDF s -它们是如何创建的,您可能需要考虑预分区这些数据框与相同的分区器——在这种情况下<代码>连接< /代码>操作不会引起洗牌,这将大大提高性能。
另一种方法是,如果列表中的数据帧相对较小,则执行广播联接。联接是一种转换-此时不触发任何计算
第一名:
您可以在操作之前取消持久化()
尝试删除取消持久化
,看看会发生什么
秒:
在您的情况下,恐怕无法从持久性中获益,因为在代码中编写的内容与以下内容相同:
base_df.join(df1, id_col).join(df2, id_col).join(df3, id_col)...
在这种情况下,base_df
只计算一次,之后只进一步使用base_df.join()的结果。这意味着base\u df
不会被重用
以下是重复使用的示例:
base_df.join(df1, id_col)
base_df.join(df2, id_col)
但这不符合你的要求。
取决于如何<代码> BaseDFF
和 ListyDF s -它们是如何创建的,您可能需要考虑预分区这些数据框与相同的分区器——在这种情况下<代码>连接< /代码>操作不会引起洗牌,这将大大提高性能。
另一种方法是,如果列表中的数据帧相对较小,则执行broadcast join
。df\u列表中的数据帧大小相同。他们点的菜不一样,所以我必须按钥匙加入他们。关于非持久性的建议,我实际上做了一些更改,同时减少了运行时间,但我不确定这些速度更改的属性在哪里。但你的建议让我改变了几件事。谢谢,我想你可以在提供你自己的答案时分享它们,以便让其他人看到:)DFU列表中的数据帧都是相同大小的。他们点的菜不一样,所以我必须按钥匙加入他们。关于非持久性的建议,我实际上做了一些更改,同时减少了运行时间,但我不确定这些速度更改的属性在哪里。但你的建议让我改变了几件事。谢谢,我想你可以分享一下,提供你自己的答案,让其他人看到:)