Spark v2.4
我想这样做
(
df.withColumn('foo', F.expr('transform(values, x -> x.v)'))
.withColumn('baz', F.expr("filter(bar, x -> !array_contains(foo, bar.v))"))
)
从.explain
开始的计划中,这似乎等于
(
df
.withColumn('baz', F.expr(
"filter(bar, x -> !array_contains(transform(values, y -> y.v), bar.v))"
))
)
也就是说,对于bar
的每个元素,spark将创建一个新的values
转换数组。对于性能来说是很糟糕的。
如何确定transform
每行仅被评估一次?