Eu tenho um quadro de dados com o seguinte código:
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"))
Agora, verificando os logs, descobri que para cada linha a UDF é executada 3 vezes. Se eu adicionar o "test3" de uma coluna "test.three", o UDF será executado novamente.
Alguém pode me explicar o porquê?
Isso pode ser evitado corretamente (sem armazenar em cache o quadro de dados após a adição de "teste", mesmo que isso funcione)?
Map
e não um Struct. Agora, em vez de retornar um mapa, se o UDF retornar uma classe de caso como Test (uma String, duas: String), na test
verdade, é uma Struct, mas sempre haverá muitas execuções da UDF.