2017-08-17 26 views
0

私はスカラ座に新しい、私は次のコードを実行しようとしています実行に失敗しました:org.apache.spark.SparkException:ユーザー定義関数

val SetID = udf{(c:String, d: String) => 
    if(c.UpperCase.contains("EXKLUS") == true) 
    {d} 
    else {""} 
} 
val ParquetWithID = STG1 
    .withColumn("ID", SetID(col("line_item"), col("line_item_ID"))) 

両方の列(line_itemline_item_id)は、以下のように定義されていますSchemaのSTG1Strings

私は、コードを実行しようとすると、私は次のエラーを取得する:

`org.apache.spark.SparkException: Failed to execute user defined function($anonfun$1$$anonfun$2: (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:370) 
at org.apache.spark.sql.execution.SparkPlan$$anonfun$4.apply(SparkPlan.scala:246) 
at org.apache.spark.sql.execution.SparkPlan$$anonfun$4.apply(SparkPlan.scala:240) 
at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$24.apply(RDD.scala:803) 
at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$24.apply(RDD.scala:803) 
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:283) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70) 
at org.apache.spark.scheduler.Task.run(Task.scala:86) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
at java.lang.Thread.run(Thread.java:748) 

Caused by: java.lang.NullPointerException 
    at MyTests$$anonfun$1$$anonfun$2.apply(MyTests.scala:356) 
    at MyTests$$anonfun$1$$anonfun$2.apply(MyTests.scala:355) 
    ... 16 more 

私もc.UpperCase().contains("EXKLUS")を試してみましたが、私は同じエラーを得ました。 しかし、単に "if equals"ステートメントを実行すると、すべて正常に動作します。だから私はudfUpperCase().contains(" ")機能を使用して問題が発生していると思いますが、どこから問題が発生しているのかわかりません。どんな助けでも謝罪されるでしょう!

答えて

0

schema

|-- line_item: string (nullable = true) 
|-- line_item_ID: string (nullable = true) 

として含まれている場合、私は答えを期待し

val SetID = udf{(c:String, d: String) => 
    if(c != null && c.toUpperCase.contains("EXKLUS") == true) 
    {d} 
    else {""} 
} 
val ParquetWithID = STG1 
    .withColumn("ID", SetID(col("line_item"), col("line_item_ID"))) 

(文字列のtoUpperCase方法があることに注意してください)のように、あなたのif文でnullをチェックすると、この問題を解決する必要があります有用です

+0

これは機能しました!ありがとう! – Inna

+0

@Innaと受け入れてくれてありがとうと聞いてよかった:) –

関連する問題