首页 > 解决方案 > Pyspark 数据框中的 Cache()

问题描述

我有一个数据框,我需要在上面包含几个转换。我想在同一个数据框中执行所有操作。因此,如果我需要使用缓存,我应该在执行每个操作后缓存数据帧吗?

df=df.selectExpr("*","explode(area)").select("*","col.*").drop(*['col','area'])
df.cache()
df=df.withColumn('full_name',f.concat(f.col('first_name'),f.lit(' '),f.col('last_name'))).drop('first_name','last_name')
df.cache()
df=df.withColumn("cleaned_map", regexp_replace("date", "[^0-9T]", "")).withColumn("date_type", to_date("cleaned_map", "ddMMyyyy")).drop('date','cleaned_map')
df.cache()
df=df.filter(df.date_type.isNotNull())
df.show()

我应该像这样添加还是缓存一次就足够了?

另外我想知道我是否对上述代码使用多个数据帧而不是一个数据帧,是否应该在每次转换时都包含缓存。非常感谢 !

标签: apache-sparkpysparkapache-spark-sqlpyspark-dataframes

解决方案


答案很简单,当你这样做df = df.cache()df.cache()两者都定位到粒度级别的 RDD 时。现在,一旦你执行任何操作,它就会创建一个新的 RDD,所以这很明显不会被缓存,所以说这取决于你想要哪个 DF/RDD cache()。另外,尽量避免尝试不必要的缓存因为数据将保存在内存中。

以下是cache()来自 spark文档的源代码

def cache(self): 
    """ 
    Persist this RDD with the default storage level (C{MEMORY_ONLY_SER}). 
    """ 
    self.is_cached = True 
    self.persist(StorageLevel.MEMORY_ONLY_SER) 
    return self 

推荐阅读