2016-11-23 4 views
0

Spark SQL DFを使用しています。これはSpark SQL udfを使用して作成した1つのUDFを呼び出しようとしています。Spark SQLのUDFメソッド内で他のメソッド/変数を呼び出すDataFrame

val udfName = udf(somemethodName) 
val newDF = df.withColumn("columnnew", udfName(col("anotherDFColumn")) 

私はsomemethodName内部valとして格納された別のDFを使用しようとしているが、DFはNULLとして来ています。

これは、私がnewDFのwhere節を使用している場合にのみ発生します。

何か不足していますか?UDFメソッド内で別の変数/メソッドを使用することはできませんか?

ブロードキャストで何かする必要がありますか?現在、私はクラスタではなく、ローカルでこれを実行しています。

答えて

1

それはUDFメソッドの内部で別の変数/メソッドを使用することはできません

それは可能場合で、その変数/メソッドがシリアライズさすることができた場合にのみ - UDFは、閉鎖されシリアライズしてエグゼキュータに配布する必要があります。あなたはUDFを使用しようとすると

DATAFRAMEは(それが他の分散データへのポインタですので、ドライバのメモリにそれを収集せずに、それをシリアル化する論理的な方法はありません)シリアライズすることはできませんのでnullとして表示されます。

おそらく、キーにある2つのデータフレームをjoinにして、結合したDataframeから列を取るUDF(または標準変換)を使用する必要があります。

+1

実際、 'Dataset' /' Dataframe'は直列化することができます。 UDFクロージャーでは使用できません。 –

+0

@Tzach Zohar:データフレーム間に共通のキーがないので、私は参加できません。他のデータフレームはルックアップファイルです.0〜60などの範囲の値がいくつかあります。私はudfメソッド内のルックアップファイルを読むことができますが、各レコードごとにファイル全体をロードする必要があります。 – Shankar

+0

@LostInOverflow:UDFメソッド名の外で定義されたリストを使用できますか?私は、ファイルから範囲を読んでリストを作成し、UDFメソッド内のリストを使用することを計画しています。それは機能しますか? – Shankar

関連する問題