我最近了解到,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'列未缓存,对吧? / p>
df.show()
第二次调用此命令可以给我与以前相同的随机数。因此,这些值现在存储在某个位置,我认为这不会发生。
我的想法哪里错了?能否给我一个非缓存的最小例子,它每次都会产生新的随机数?
答案 0 :(得分:2)
在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()
时,都会得到不同的结果。