Saya memiliki kerangka data dengan kode berikut:
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"))
Sekarang memeriksa log, saya menemukan bahwa untuk setiap baris UDF dieksekusi 3 kali. Jika saya menambahkan "test3" dari kolom "test.three" maka UDF dieksekusi sekali lagi.
Adakah yang bisa menjelaskan mengapa?
Bisakah ini dihindari dengan benar (tanpa caching kerangka data setelah "tes" ditambahkan, bahkan jika ini berhasil)?
Map
dan bukan Struct. Sekarang alih-alih mengembalikan Peta, jika UDF mengembalikan kelas kasus seperti Uji (satu String, dua: String) maka test
memang merupakan Struct tetapi selalu ada banyak eksekusi dari UDF.