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

10-13 07:08