我最近了解到,Spark DAG会延迟执行,并且除非您明确调用DF.cache()
,否则决不会缓存中间结果。
现在,我进行了一个实验,基于该事实,每次应给我不同的随机数:
from pyspark.sql.functions import rand
df = spark.range(0, 3)
df = df.select("id", rand().alias('rand'))
df.show()
如预期的那样,多次执行这些行会为我每次提供不同的随机数。但是,如果从不存储计算值(在这种情况下为
rand()
),则每次仅调用df.show()
应该会每次给我新的随机数,因为不会缓存'rand'列,对吗?df.show()
不过,此命令第二次给了我相同的随机数。因此,这些值现在存储在某个位置,我认为这不会发生。
我的想法哪里错了?能否给我一个非缓存的最小例子,它每次都会产生新的随机数?
最佳答案
当在rand()
方法内部调用rand().alias('rand')
时,设置select
的随机种子参数,并且此后不更改。因此,多次调用show
确实总是使用相同的随机种子,因此结果是相同的。
单独返回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()
时,都会得到不同的结果。关于apache-spark - Spark DataFrame是否曾经隐式缓存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52739566/