morthyJ:
私はいくつかのUDFを登録し、すべて同じ入力パラメータの型と同じ出力タイプ(String)を持っています。レッツはUDF1、udf2、udf3を言います。すべては、異なる機能を持っています。
私のデータセットでは、私は、複数の列を持って1列に私は、このデータの行に実行するUDFの名前を持っています。
データセットの例:
+---+-------+-------+
|A | B |udf |
+---+-------+-------+
|1 | a |udf1 |
|2 | b |udf2 |
|3 | c |udf3 |
+---+-------+-------+
私はこのような何かをしたいです:
ds.withColumn("TEST", functions.callUDF(<name of right udf>, col("A"), col("B"))
私はこれをどのように達成することができますか?それが可能であり、そうでない場合は、可能な回避策は何ですか?
背景:私のスパーク仕事のUDFのセットを持って、私は動的に行の右のUDFを実行したいです。
Saswat:
これを試して ::
def func1(y: Int, z: String): String = y+z
def func2(y: Int, z: String): String = y+","+z
def default(y: Int, z: String): String = y
val udfName = udf({ (x: String, y: Int, z: String) => x match {
case "func1" => func1(y,z)
case "func2" => func2(y,z)
case _ => default(y,z)
}})
val data = Seq((1,"a","func1"),
(2,"b","func2")
).toDF("A", "B", "udf")
data.withColumn("TEST", udfName(col("udf"), col("A"), col("B")))
また、これを処理する、より高度な方法については、ソースコードライブラリを使用することができます。