我有一个带有以下代码的数据框:
def test(lat: Double, lon: Double) = {
println(s"testing ${lat / lon}")
Map("one" -> "one", "two" -> "two")
}
val testUDF = udf(test _)
df.withColumn("test", testUDF(col("lat"), col("lon")))
.withColumn("test1", col("test.one"))
.withColumn("test2", col("test.two"))
现在检查日志,我发现每行UDF执行3次。如果我从“ test.three”列中添加“ test3”,则将再次执行UDF。
有人可以解释我为什么吗?
是否可以正确避免这种情况(即使添加了“测试”,也无需缓存数据框,即使这可行)?
你什么意思?您要调用测试函数三次。这就是为什么它被执行了三次。不知道为什么要使用UDF。为什么不只是将Map设为val?
—
user4601931
这只是显示火花行为的一个示例。对我来说,“ test”是一个包含结构的新列,然后访问该结构的任何部分都不应再次执行UDF。我怎么了
—
Rolintocour
我尝试打印模式,“ test”的数据类型
—
Rolintocour
Map
不是Struct。现在,如果UDF返回的是诸如Test(一个String,两个:String)之类的case类,则test
它实际上不是Struct,而是返回的UDF的执行次数总是很多。
缓存应根据以下答案进行工作:stackoverflow.com/a/40962714/1138523
—
Raphael Roth,