将触发延迟执行导致列表覆盖?



我的问题是quantile_fooquantile_bar是传递给每个循环的正确值吗?quantile_fooquantile_bar的值是否会因为spark延迟执行而被设置为最后一次,即循环中的i=5,以至于我总是得到错误的foo_quantile_{i},除了foo_5?

df = spark.sql("select * from some_table")
for i in range(5):
quantile_foo = df.approxQuantile("foo_{}".format(str(i)),[0.25,0.5,0.75],0.05)
quantile_bar = df.approxQuantile("bar_{}".format(str(i)),[0.25,0.5,0.75],0.05)

df = df.withColumn("foo_quantile_{}".format(str(i)),
F.when(F.col("foo_{}".format(str(i))>quantile_foo[0],75))
.when(F.col("foo_{}".format(str(i))>quantile_foo[1],50))
... ...
)
df = df.withColumn("bar_quantile_{}".format(str(i)),
F.when(F.col("bar_{}".format(str(i))>quantile_foo[0],75))
.when(F.col("bar_{}".format(str(i))>quantile_foo[1],50))
... ...
)

我会说你的问题的答案是是的,它会采取I的最后一个值来执行操作,但这与spark懒惰评估无关。

在python中,你给一个变量赋了一个不同的值,因为它是在for循环中,无论何时你从for循环中出来,你都会得到最后一个值。

最新更新