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)?
Map
a nie Struct. Teraz zamiast zwracać Mapę, jeśli UDF zwraca klasę sprawy, taką jak Test (jeden Łańcuch, dwa: Łańcuch), wówczas test
rzeczywiście jest Struktem, ale zawsze jest tyle wykonań UDF.