ฉันมีชื่อไฟล์พร้อมรหัสต่อไปนี้:
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"))
ตอนนี้ตรวจสอบล็อกฉันพบว่าสำหรับแต่ละแถว UDF จะถูกดำเนินการ 3 ครั้ง ถ้าฉันเพิ่ม "test3" จากคอลัมน์ "test.three" ดังนั้น UDF จะถูกดำเนินการอีกครั้ง
มีคนอธิบายได้ไหมทำไม
สามารถหลีกเลี่ยงสิ่งนี้ได้อย่างถูกต้องหรือไม่ (โดยไม่ต้องแคชข้อมูลหลังจากที่เพิ่ม "test" แม้ว่าจะใช้งานได้)?
Map
ไม่ใช่ Struct ตอนนี้แทนที่จะส่งคืนแผนที่ถ้า UDF ส่งคืนคลาสเคสเช่นการทดสอบ (หนึ่งสตริงสอง: สตริง) ดังนั้นtest
แท้จริงแล้วเป็นโครงสร้าง แต่มีการประมวลผล UDF จำนวนมากเสมอ