다음 코드가있는 데이터 프레임이 있습니다.
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 번 실행된다는 것을 알았습니다. "test.three"열에서 "test3"을 추가하면 UDF가 한 번 더 실행됩니다.
누군가 왜 나에게 설명 할 수 있습니까?
"테스트"가 추가 된 후 데이터 프레임을 캐싱하지 않아도 제대로 작동하지 않을 수 있습니까?
무슨 소리 야? 테스트 기능을 세 번 호출합니다. 그것이 세 번 실행되는 이유입니다. 왜 UDF로 만들고 있는지 잘 모르겠습니다. 왜지도를 발로 만들지 않습니까?
—
user4601931
이것은 스파크의 동작을 보여주는 예일뿐입니다. 나를 위해 "test"는 구조를 포함하는 새로운 열이며, 구조의 어떤 부분에 액세스해도 UDF를 다시 실행해서는 안됩니다. 내가 어떻게 틀렸어?
—
Rolintocour 2016
"test"의 DataType은
—
Rolintocour 2016
Map
Struct 가 아니라 스키마를 인쇄하려고했습니다 . 이제 UDF가 Map (one String, two : String)과 같은 케이스 클래스를 리턴하면 맵을 리턴하는 대신 test
실제로 Struct이지만 UDF 실행 횟수는 항상 있습니다.
캐싱은이 대답에 따라 작동합니다 : stackoverflow.com/a/40962714/1138523
—
라파엘 로스에게