次のコードのデータフレームがあります。
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がもう一度実行されます。
なぜ誰かが私に理由を説明できますか?
これは適切に回避できますか?
どういう意味ですか?テスト関数を3回呼び出しています。そのため、3回実行されます。なぜUDFにするのかわかりません。なぜマップをただの値にしないのですか?
—
user4601931
これは、スパークの動作を示すための単なる例です。私にとって「テスト」は構造を含む新しい列であり、構造の任意の部分にアクセスしてもUDFを再度実行するべきではありません。どうしたの?
—
Rolintocour
スキーマを印刷しようとしましたが、 "test"のDataTypeは
—
Rolintocour
Map
Structではありません。マップを返す代わりに、UDFがTest(one String、two:String)のようなケースクラスを返す場合、test
実際にはStructですが、UDFの実行は常に同じです。
キャッシングはこの回答に従って機能するはずです:stackoverflow.com/a/40962714/1138523
—
Raphael Roth