Tôi có một khung dữ liệu với mã sau đây:
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"))
Bây giờ kiểm tra các bản ghi, tôi phát hiện ra rằng đối với mỗi hàng, UDF được thực thi 3 lần. Nếu tôi thêm "test3" từ cột "test.three" thì UDF được thực thi một lần nữa.
Ai đó có thể giải thích cho tôi tại sao?
Điều này có thể tránh được một cách chính xác (mà không lưu bộ đệm dữ liệu sau khi "kiểm tra" được thêm vào, ngay cả khi điều này hoạt động)?
Map
không phải là Struct. Bây giờ thay vì trả về một Bản đồ, nếu UDF trả về một lớp trường hợp như Test (một Chuỗi, hai: Chuỗi) thì test
thực sự là Cấu trúc nhưng luôn có nhiều lệnh thực thi của UDF.