2017-04-25 6 views
0

ユーザーが設計した関数内に別のクラスにあるメソッドを使用したいが、機能しない。UDF関数内のメソッドを使用するSpark Scala

私は方法があります。

def traitementDataFrameEleve(sc:SparkSession, dfRedis:DataFrame, domainMail:String, dir:String):Boolean ={ 
    def loginUDF = udf((sn: String, givenName:String) => { 
      LoginClass.GenerateloginPersone(sn,givenName,dfr) 
      }) 

    dfEleve.withColumn("ENTPersonLogin",loginUDF(dfEleve("sn"),dfEleve("givenName"))) 
} 

LoginClassはGenerateloginPersoneメソッドを含むクラスです。

出力エラー:

org.apache.spark.SparkException: Failed to execute user defined function(anonfun$loginUDF$1$1: (string, string) => string) 
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source) 
    at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 
    at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:377) 
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:231) 
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:225) 
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 
    at org.apache.spark.scheduler.Task.run(Task.scala:99) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NullPointerException 
    at org.apache.spark.sql.Dataset.schema(Dataset.scala:410) 
    at org.apache.spark.sql.Dataset.printSchema(Dataset.scala:419) 
    at IntegrationDonneesENTLea_V1_AcBordeaux.LoginClass$.GenerateloginPersone(LoginClass.scala:16) 
    at IntegrationDonneesENTLea_V1_AcBordeaux.Eleve$$anonfun$loginUDF$1$1.apply(Eleve.scala:25) 
    at IntegrationDonneesENTLea_V1_AcBordeaux.Eleve$$anonfun$loginUDF$1$1.apply(Eleve.scala:23) 
    ... 16 more 

ありがとうございました。

+0

"動作しません" - 何が動作しないのですか?これはどのように失敗するのですか?(コンパイルエラー?ランタイム例外?予期しない出力?)すべての必要な情報が含まれている**という質問を**編集してください(http://stackoverflow.com/posts/43616403/edit)。 –

+0

投稿を更新しました@TzachZohar –

+0

dfrとは何ですか?あなたはdfRedisを意味しましたか? –

答えて

2

これは、アクセスを許可されていません:(DatasetまたはRDDなど)

  • 分散データ構造。
  • SparkConext
  • /スパークタスクからSparkSession

(変換、udfアプリケーション)。これがNPEを取得した理由です。

+0

これを行うには他の方法はありませんか? –

+1

@MounirHamdaneは何をするのですか?あなたはUDFの中から(あなたの投稿のタイトルごとに)メソッドを呼び出すことができますが、ここでの問題はメソッドの_contents_です。 'GenerateloginPersone'は' Dataset.printSchema'を呼び出すようです。私たちは 'GenerateloginPersone'の実装を見ることができないので、どのようにして実装するべきか、実装するべきかについて、これ以上の洞察を提供することはできません。要約すると、はい、UDF内からメソッドを呼び出すことができます。しかし、これらのメソッドは 'SparkContext' /' SparkSession'やそれを使うもの( 'Dataset' /' RDD'など)を使うことはできません。 –

+0

はい、私はメソッド内で使用できますが、データフレーム引数を渡すことはできません –

関連する問題