DeltaTable.toDF的惰性机制:更新后访问会重读还是重放更新?
Delta表updateExpr后toDF的行为问题
问题场景
假设执行如下Scala代码:
import io.delta.tables._ val deltaTable = DeltaTable.forPath(spark, "...") deltaTable.updateExpr( "column_name = value", Map("updated_column" -> "'new_value'") ) val df = deltaTable.toDF
在执行上述updateExpr更新操作后,调用deltaTable.toDF得到的DataFrame(df)在被访问(例如调用df.count())时,会按需重新读取底层Delta表的内容(即deltaTable.toDF等效于spark.read.format("delta").load(path)),还是会重新应用之前的一系列更新操作?
答案
deltaTable.updateExpr是立即执行的写操作,执行完成后会直接修改底层Delta表的物理数据(生成新的版本文件),此时底层表的数据已经是更新后的状态。- 调用
deltaTable.toDF生成的DataFrame,本质就是读取当前Delta表最新状态的查询,和直接使用spark.read.format("delta").load(path)的效果完全一致。 - 当访问
df(比如调用df.count())时,它会直接读取底层Delta表的最新物理数据,不会重新执行之前的updateExpr操作——因为更新操作已经落地到存储,不需要重复应用。
内容的提问来源于stack exchange,提问作者wrschneider
相关产品推荐
相关产品推荐

