Scala Luna Eclipse IDE を使用して、spark で日付機能を抽出するための単純な UDF を登録しようとしています。これは私のコードです:
sqlContext.udf.register("extract", (dateUnit: String, date : String) => udf.extract(dateUnit,date ) )
def extract(dateUnit : String, date: String) : String = {
val splitArray : Array[String] = date.split("-")
val result = dateUnit.toUpperCase() match {
case "YEAR" => splitArray(0)
case "MONTH" => splitArray(1)
case "DAY" => splitArray(2)
case whoa => "Unexpected case :" + whoa.toString()
}
return result ;
}
この機能を Eclipse コンソールで実行すると、Select * from date_dim WHERE d_dom < extract('YEAR', '2015-05-01') limit 10"
ansエラーをスローします
org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
Aggregate false, [], [Coalesce(SUM(PartialCount#30L),0) AS count#28L]
Aggregate true, [], [COUNT(1) AS PartialCount#30L]
Project []
Caused by: org.apache.spark.SparkException: Task not serializable
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at java.io.ObjectStreamClass$FieldReflector.getObjFieldValues(ObjectStreamClass.java:2030)
at java.io.ObjectStreamClass.getObjFieldValues(ObjectStreamClass.java:1232)
問題が何であるかを正確に見つけることができません。直接定義されている単純な udfs はsqlContext.udf.register("strLength", (str: String) => str.length() )
正常に実行されます。上記の同じ関数は、spark の Scala シェルを介して正常に実行されます。ここでの問題は何ですか。私は何か間違ったことをしていますか?