Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 缓存Spark数据帧以提高速度_Python_Apache Spark_Dataframe_Pyspark_Apache Spark Sql - Fatal编程技术网

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列表中的数据帧都是相同大小的。他们点的菜不一样,所以我必须按钥匙加入他们。关于非持久性的建议,我实际上做了一些更改,同时减少了运行时间,但我不确定这些速度更改的属性在哪里。但你的建议让我改变了几件事。谢谢,我想你可以分享一下,提供你自己的答案,让其他人看到:)