У меня есть датафрейм со следующим кодом:
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.