Skip to main content
 首页 » 编程设计

python之如果将 DataFrame 保存到磁盘,如果您在脚本中使用该 DataFrame,Spark 是否会加载该数据

2024年11月24日35sxdcgaq8080

如果您加载一些数据,计算一个 DataFrame,将其写入磁盘,然后稍后使用 DataFrame...假设它仍未缓存在 RAM 中(假设内存不足),Spark 是否足够智能从磁盘加载数据而不是从原始数据重新计算 DataFrame?

例如:

df1 = spark.read.parquet('data/df1.parquet') 
df2 = spark.read.parquet('data/df2.parquet') 
 
joined = df1.join(df2, df1.id == df2.id) 
joined.write.parquet('data/joined.parquet') 
 
computed = joined.select('id').withColummn('double_total', 2 * joined.total) 
computed.write.parquet('data/computed.parquet') 

在适当的情况下,当我们存储 computed 时,它会从 data/joined.parquet 加载 joined DataFrame 还是总是如果当前未缓存 joined,则通过加载/加入 df1/df2 重新计算?

请您参考如下方法:

joined 数据框指向 df1.join(df2, df1.id == df2.id)。据我所知,parquet writer 不会对该引用进行任何更改,因此为了加载 parquet 数据,您需要使用 spark.reader.parquet(...) 构造一个新的 Spark reader .

您可以从 DataFrameWriter 中验证上述说法。代码(检查 parquet/save 方法)返回 Unit 并且不以某种方式修改源数据帧的引用。最后在上面的例子中回答你的问题,加入的数据帧将为 joined.write.parquet('data/joined.parquet') 和一次为 computed.write.parquet( 'data/computed.parquet')