if else的Spark scala udf错误

时间:2017-01-24 03:53:05

标签: scala date apache-spark udf

我正在尝试使用函数getTIme为spark scala udf定义udf,但我收到的错误为error: illegal start of declaration。语法中的错误和retutrn日期以及如果存在解析异常而不是撤销null,则将某些字符串发送为错误

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  
}})

谢谢!

3 个答案:

答案 0 :(得分:2)

udf的返回类型是派生的,不应指定。将第一行代码更改为:

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

这应该摆脱错误。

以下是以功能样式编写并使用Scala结构的完全正常工作的代码:

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:...|
+-------------------+--------------------+

答案 1 :(得分:0)

您应该使用Scala数据类型,而不是Java数据类型。它会是这样的:

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

}

答案 2 :(得分: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 。 !