У меня есть датафрейм со следующим кодом:
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 раза. Если я добавлю «test3» из столбца «test.three», UDF будет выполнен еще раз.
Может кто-нибудь объяснить мне, почему?
Можно ли этого избежать должным образом (без кэширования данных после добавления «теста», даже если это работает)?
Mapне Struct. Теперь вместо возврата Map, если UDF возвращает класс case, такой как Test (одна String, две: String), тогда testэто действительно Struct, но всегда есть столько исполнений UDF.