Mam ramkę danych z następującym kodem:
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"))
Teraz sprawdzając dzienniki, dowiedziałem się, że dla każdego wiersza UDF jest wykonywany 3 razy. Jeśli dodam „test3” z kolumny „test.three”, UDF zostanie ponownie wykonany.
Czy ktoś może mi wyjaśnić, dlaczego?
Czy można tego właściwie uniknąć (bez buforowania ramki danych po dodaniu „testu”, nawet jeśli to działa)?
Mapa nie Struct. Teraz zamiast zwracać Mapę, jeśli UDF zwraca klasę sprawy, taką jak Test (jeden Łańcuch, dwa: Łańcuch), wówczas testrzeczywiście jest Struktem, ale zawsze jest tyle wykonań UDF.