缓存()是一个Apache火花DataFrame转换,可以使用,数据集或抽样当您想要执行多个操作。缓存()缓存指定DataFrame、数据集或集群抽样的记忆你的工人。自缓存()是一个变换,缓存操作发生只有当火花操作(例如,count (),显示(),带(),或write ())也用于DataFrame相同,数据集或抽样在一个单一的行动。
分别调用缓存()和数量()
% scala df1 = spark.read.parquet (input_path1) df2 = spark.read.parquet (input_path2) df1.cache() #缓存DataFrame df1 joined_df = df1。加入(df2 df1.id = = df2。id、“内在”)#加入DataFrame df1和df2 filtered_df = joined_df。过滤器(" name = =约翰”)#过滤器名称“约翰”的加入DataFrame df1.count() #调用数()缓存DataFrame filtered_df.show() #显示过滤DataFrame filtered_df
在这个例子中,DataFramedf1缓存到内存时df1.count ()是执行。df1.cache ()不启动DataFrame缓存操作吗df1。
调用缓存DataFrame带()
% scala df = spark.table (input_table_name) df.cache.take(5) #叫带(5)DataFrame df,同时还可以缓存它df.count() #调用计数DataFrame df ()
在这个例子中,DataFramedf缓存到内存时(5)是执行。只有一个分区的DataFramedf在这种情况下,缓存,因为(5)只有流程5条记录。只有记录的分区处理,且仅处理分区的缓存。其他分区的DataFramedf也不会被缓存。
因此,当df.count ()被调用时,DataFramedf再次创建,因为只有一个分区可用集群的缓存。
调用(5)在这个示例中只缓存DataFrame的14%。
缓存DataFrame调用数()
% scala df = spark.table (input_table_name) df.cache.count() #调用计数DataFrame df(),同时还可以缓存它df.count() #调用数()DataFrame df df.filter (" name = =约翰”).count ()
在这个例子中,DataFramedf缓存到内存时df.count ()是执行。返回dataframe的计数,处理所有的分区。这意味着所有的缓存分区。
因此,当df.count ()和df.filter (" name = =约翰”).count ()DataFrame,称为后续行动吗df获取集群的缓存,而不是被重新创建。
调用count ()在这个例子中缓存DataFrame的100%。
总结
你应该叫count ()或write ()后立即调用缓存()这样整个DataFrame处理和缓存在内存中。如果你只缓存DataFrame的一部分,整个DataFrame可能重新计算当DataFrame执行后续操作。