Ho un dataframe con il seguente codice:
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"))
Ora controllando i registri, ho scoperto che per ogni riga l'UDF viene eseguito 3 volte. Se aggiungo "test3" da una colonna "test.three", l'UDF viene eseguito ancora una volta.
Qualcuno può spiegarmi perché?
Questo può essere evitato correttamente (senza memorizzare nella cache il frame di dati dopo aver aggiunto "test", anche se funziona)?
Map
e non un Struct. Ora invece di restituire una mappa, se l'UDF restituisce una classe case come Test (una stringa, due: stringa), allora test
è effettivamente uno Struct ma ci sono sempre tante esecuzioni dell'UDF.