web-dev-qa-db-ja.com

SQLおよびDataFrameで使用するUDFを登録する方法

私が見たことから、これを行うにはあなたがしなければならない

  1. udfを単純な関数にする
  2. sQLの関数をSQLContextに登録する

    spark.sqlContext.udf.register("myUDF", myFunc)
    
  3. これをUserDefinedFunctionDataFrameに変換します

    def myUDF = udf(myFunc)
    

これを1つのステップに組み合わせて、udfを両方で使用できるようにする方法はありませんか?また、関数がDataFrameには存在するがSQLには存在しない場合、コードを再度コピーせずに関数を登録するにはどうすればよいですか?

7
ninja

UDFRegistration.registerバリアント、scala.FunctionNUserDefinedFunctionを返すので、SQL関数を登録してDSL対応のUDFを1つのステップで作成できます。

val timesTwoUDF = spark.udf.register("timesTwo", (x: Int) => x * 2)
spark.sql("SELECT timesTwo(1)").show
+---------------+
|UDF:timesTwo(1)|
+---------------+
|              2|
+---------------+
spark.range(1, 2).toDF("x").select(timesTwoUDF($"x")).show
+------+
|UDF(x)|
+------+
|     2|
+------+
14
zero323

以下を使用して、それをデータフレームに適用することができます

spark.sqlContext.udf.register("myUDF", myFunc)

データフレーム変換で呼び出す場合は、selectExprを使用します。

df.selectExpr("myUDF(col1) as modified_col1")
3
dansuzuki

Spark2の更新-

spark.udf.register( "func_name"、func_name)

引数1-スパークに登録される関数名

引数2-Python/scalaでの作成中に定義される関数名

関数を同じ名前でSparkに登録することをお勧めします。

2
Shan