0
sqlContextのHiveテーブルで使用したいUDFを作成しようとしています。シリアライズ可能でない他のライブラリのオブジェクトを含めることは、いかなる方法で可能ですか?ここでは動作しないものの最小限の例です:シリアル化可能でないオブジェクトを含むSparkSQL UDFを作成する
def myUDF(s: String) = {
import sun.misc.BASE64Encoder
val coder= new BASE64Encoder
val encoded= decoder.encode(s)
encoded
}
私はテーブル「テスト」
上でそれを実行しようとした場合、私はUDF関数としてスパークシェルでval encoding = sqlContext.udf.register("encoder", myUDF)
を関数を登録します
sqlContext.sql("SELECT encoder(colname) from test").show()
私はエラー
org.apache.spark.SparkException: Task not serializable
object not serializable (class: sun.misc.BASE64Encoder, value: [email protected])
を取得10
これには回避策がありますか?私は、オブジェクトとクラスにmyUDFを埋め込もうとしましたが、それもうまくいきませんでした。
あなたのソリューションはうまくいきますが、後で私の問題が悪いと認識していて、それがうまく動作するようになったことに気付きました。 – Harpe
@Harpe、はいあなたのやり方も正しいです:) upvoteのおかげで:)あなたが望むならそれを受け入れることができます;) –
このコードはまた、すべての単一の行に対して新しい 'BASE64Encoder'オブジェクトをインスタンス化します。それはあなたのアプリケーションで大丈夫かもしれませんが、潜在的なパフォーマンスの影響があります。私も同様の問題で苦労しています。 – santon