我的问题是quantile_foo
和quantile_bar
是传递给每个循环的正确值吗?quantile_foo
和quantile_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循环中出来,你都会得到最后一个值。