2017-01-24 15 views
1

spark scala udfのgetTIme関数でudfを定義しようとしていますが、エラーがerror: illegal start of declarationとして表示されています。どのような構文にエラーがあることと日付をretutrnしても代わりにヌルをreturingの解析例外がある場合は可能性がある、spark scala udfエラーelse if

def getTime=udf((x:String) : java.sql.Timestamp => { 
if (x.toString() == "") return null 
else { val format = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); 
val d = format.parse(x.toString()); 
val t = new Timestamp(d.getTime()); return t 
}}) 

ありがとうエラーとして、いくつかの文字列を送信!

+0

が条件の場合にnull.asInstanceOf [タイムスタンプ]を試します –

+0

null.asInstanceOf [タイムスタンプ]は、解析日の間のエラーメッセージのためだと思いますが、エラーは何ですか? "エラー:不正な開始宣言" – bob87

答えて

1

udfの戻り値の型は派生したものであり、指定しないでください。コードの最初の行を次のように変更します。

def getTime=udf((x:String) => { 
// your code 
} 

エラーを取り除く必要があります。

次は、機能的なスタイルとスカラ座の作る使用で書かれた完全に動作するコードが作成されます。

val data: Seq[String] = Seq("", null, "2017-01-15 10:18:30") 
val ds = spark.createDataset(data).as[String] 

import java.text.SimpleDateFormat 
import java.sql.Timestamp 

val fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 
// ********HERE is the udf completely re-written: ********** 
val f = udf((input: String) => { 
    Option(input).filter(_.nonEmpty).map(str => new Timestamp(fmt.parse(str).getTime)).orNull 
}) 

val ds2 = ds.withColumn("parsedTimestamp", f($"value")) 

され、次の出力:

+-------------------+--------------------+ 
|    value|  parsedTimestamp| 
+-------------------+--------------------+ 
|     |    null| 
|    null|    null| 
|2017-01-15 10:18:30|2017-01-15 10:18:...| 
+-------------------+--------------------+ 
0

Javaデータ型ではなく、Scalaデータ型を使用する必要があります。それはこのように行くだろう:

def getTime(x: String): Timestamp = { 
//your code here 

} 
0

あなたはこの方法でそれを簡単に行うことができます

def getTimeFunction(timeAsString: String): java.sql.Timestamp = { 
    if (timeAsString.isEmpty) 
    null 
    else { 
    val format = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss") 
    val date = format.parse(timeAsString.toString()) 
    val time = new Timestamp(date.getTime()) 
    time 
    } 
} 
val getTimeUdf = udf(getTimeFunction _) 

は、それに応じて、このgetTimeUdfを使用しています。 !

+0

ここで、udf(getTimeFunction _)にString入力が与えられています。 – bob87