スパークは、カラムからUDF名を取得し、それを実行します

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")))

また、これを処理する、より高度な方法については、ソースコードライブラリを使用することができます。

PARAMとして送信された関数名を取得SCALA

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313500&siteId=1