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

时间:2019-07-01 04:29:05

标签: python apache-spark caching pyspark apache-spark-sql

如果您加载一些数据,计算一个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时,它将从joined加载data/joined.parquet DataFrame,还是总是通过加载/加入df1 /重新计算df2是否当前不缓存joined

1 个答案:

答案 0 :(得分:1)

let gesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped(_:))) gesture.delegate = self //here...... self.puttingView.addGestureRecognizer(gesture) 数据帧指向joined。据我所知,镶木地板编写者不会对该引用进行任何更改,因此,为了加载镶木地板数据,您需要使用df1.join(df2, df1.id == df2.id)构造一个新的Spark阅读器。

您可以通过DataFrameWriter代码(检查镶木地板/保存方法)验证以上声明,该代码返回Unit,并且不以任何方式修改源数据帧的引用。最后,在上述示例中回答您的问题,将为spark.reader.parquet(...)计算一次联合数据帧,为joined.write.parquet('data/joined.parquet')计算一次