【发布时间】:2019-11-04 15:12:40
【问题描述】:
我有一个包含以下代码的数据框:
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。
谁能解释一下为什么?
这是否可以正确避免(在添加“测试”后不缓存数据帧,即使这样可行)?
【问题讨论】:
-
什么意思?您正在调用 test 函数三遍。这就是为什么它被执行了三遍。不知道你为什么要把它变成一个 UDF。为什么不直接将 Map 设为 val?
-
这只是一个展示spark行为的例子。对我来说,“测试”是一个包含结构的新列,然后访问结构的任何部分都不应再次执行 UDF。我怎么错了?
-
我尝试打印架构,“test”的数据类型是
Map,而不是结构。现在,如果 UDF 返回一个类似 Test(one String, two: String) 的案例类,而不是返回 Map,那么test确实是一个 Struct,但 UDF 的执行次数总是一样多。 -
缓存应该根据这个答案工作:stackoverflow.com/a/40962714/1138523
标签: scala apache-spark apache-spark-sql