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()
。
我最近了解到 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()
。