Spark DataFrame是否曾经隐式缓存?

时间:2018-10-10 11:48:24

标签: apache-spark pyspark pyspark-sql

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

第二次调用此命令可以给我与以前相同的随机数。因此,这些值现在存储在某个位置,我认为这不会发生。

我的想法哪里错了?能否给我一个非缓存的最小例子,它每次都会产生新的随机数?

1 个答案:

答案 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()时,都会得到不同的结果。