2017-04-25 4 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

"작동하지 않지만"- 작동하지 않는 것이 있습니까? 어떻게 실패합니까 (컴파일 오류? 런타임 예외? 예상치 못한 결과?). ** 필요한 모든 정보를 포함하려면 ** [edit] (http://stackoverflow.com/posts/43616403/edit) 질문 **을 작성하십시오. –

+0

내 게시물 @TzachZohar을 업데이트했습니다. –

+0

dfr이란 무엇입니까? dfRedis를 원하셨습니까? –

답변

2

는 그것은 액세스가 허용되지 않습니다

  • 분산 데이터 구조를 (같은 Dataset 또는 RDD).
  • SparkConext/스파크 태스크에서 SparkSession

(변형, 응용 udf). 이것이 NPE를받는 이유입니다.

+0

다른 방법으로이 작업을 수행 할 수 없습니까? –

+1

@MounirHamdane 할 _what_? 당신은 UDF 내에서 (게시물 제목 당) 메소드를 호출 할 수 있습니다. 여기서 문제는 메소드의 _contents_입니다. 'GenerateloginPersone'은 'Dataset.printSchema'를 호출하는 것으로 보이는데, 이는 할 수없는 일입니다. 우리는'GenerateloginPersone'의 구현을 볼 수 없으므로, 어떻게 구현할 수 있는지 또는 구현해야하는지에 대한 더 이상의 통찰력을 제공 할 수는 없습니다. 우리는 그것이 무엇인지 모릅니다. 요약하면 : 예, UDF 내에서 메소드를 호출 할 수 있습니다. 그러나이 방법은'SparkContext' /'SparkSession'이나 그것들을 사용하는 어떤 것도 사용할 수 없습니다 (예 :'Dataset' /'RDD'). –

+0

예, 메소드 내에서 사용할 수는 있지만 데이터 프레임 인수는 전달하지 않습니다. –