2017-02-08 14 views
0

私はデータフレームと一緒に関数の引数として渡すに沿ってみたいいくつかのUDFを持っているではありません。これを行うには、UDFは、関数スコープ

一つの方法は、関数内でUDFを作成するかもしれないが、それは、この問題にアプローチする最良の方法ではないかもしれないそれを再利用せずにUDFの複数のインスタンスを作成し、破壊するであろう。ここで

コードのサンプル片です -

val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} 

val df = inputDF1 
    .withColumn("new_col", lkpUDF(col("c1"))) 
val df2 = inputDF2. 
    .withColumn("new_col", lkpUDF(col("c1"))) 

の代わりに上記をやって、私は理想的にこのような何かをしたいと思いますが -

val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} 

def appendCols(df: DataFrame, lkpUDF: ?): DataFrame = { 

    df 
     .withColumn("new_col", lkpUDF(col("c1"))) 

    } 
val df = appendCols(inputDF, lkpUDF) 

UDF上記ザ・は非常に単純ですが、私の場合、それは、プリミティブ型、またはユーザ定義のケースクラスの型を返すことができます。任意の思考/ポインタは非常に高く評価されるだろう。ありがとう。

import org.apache.spark.sql.UserDefinedFunction 

def appendCols(df: DataFrame, func: UserDefinedFunction): DataFrame = { 
    df.withColumn("new_col", func(col("col1"))) 
} 

REPLが初期化された値の型を返すでは非常に有用であるスカラ:適切なシグネチャを持つ

答えて

3

あなたの関数は、このする必要があります。

scala> val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} 
lkpUDF: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,List(IntegerType)) 

また、あなたがudfラッパーに渡す関数のシグネチャは(関数プリミティブまたはユーザー定義の場合クラスのいずれかを返すことができる場合にケースになる)Any戻り型で構成されている場合、 UDFは次のような例外を伴ってコンパイルに失敗します。

java.lang.UnsupportedOperationException: Schema for type Any is not supported 
+0

ありがとうseptra。あなたは私が上記のエラーを打つのは間違いありません。しかし、私は唯一のケースクラスを返すようにしようとした場合にも、このエラーを打っているように見えます。 http://stackoverflow.com/questions/42121649/schema-for-type-any-is-not-supported – Yash