Spark DataFrames 是否曾经隐式缓存?

Are Spark DataFrames ever implicitly cached?

我最近了解到 Spark DAG 会延迟执行,中间结果永远不会被缓存,除非您显式调用 DF.cache()

现在我已经 运行 了一个实验,每次都会给我不同的 运行dom 数字,基于这个事实:

from pyspark.sql.functions import rand

df = spark.range(0, 3)
df = df.select("id", rand().alias('rand'))

df.show()

如预期的那样,多次执行这些行每次都会给我不同的 运行dom 编号。但是,如果从未存储计算值(在本例中为 rand()),那么重复调用 df.show() 应该每次都会给我新的 运行dom 数字,因为 'rand' 列没有缓存,对吧?

df.show()

第二次调用此命令时,我得到了与以前相同的 运行dom 编号。所以这些值现在存储在某个地方,我认为这不会发生。

我的想法哪里错了?你能给我一个最小的非缓存示例,它每次都会产生新的 运行dom 数字吗?

rand()的随机种子参数是在select方法内部调用rand().alias('rand')时设置的,之后不会改变。因此,多次调用 show 总是使用相同的随机种子,因此结果是相同的。

当你单独return rand().alias('rand')的结果时,你可以更清楚地看到它,它还显示了随机种子参数:

>>> rand().alias('rand')
Column<b'rand(166937772096155366) AS `rand`'>

直接提供种子时,会相应显示:

>>> rand(seed=22).alias('rand') 
Column<b'rand(22) AS `rand`'>

随机种子在调用 rand() 时设置,并作为列表达式存储在 select 方法中。因此结果是一样的。每次重新计算 rand() 时,您都会得到不同的结果,例如 df.select("id", rand().alias('rand')).show()