2017-01-24 11 views
1

Я пытаюсь определить udf с функцией getTIme для искры scala udf, но я получаю ошибку как error: illegal start of declaration. Что может быть ошибка в синтаксисе и retutrn дату, а также, если есть исключение синтаксического анализа вместо returing в нуль, отправить некоторую строку, как ошибкиSpark scala udf error для if else

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 [Timestamp], если условие –

+0

Я думаю, что null.asInstanceOf [Timestamp] для сообщения об ошибке во время синтаксического анализа является нулевым, но что такое ошибка «ошибка: незаконный запуск объявления» – bob87

ответ

1

Тип возврата для 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:...| 
+-------------------+--------------------+ 
0

Вы должны использовать типы данных Scala, а не типы данных Java. Он бы так:

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

Где вход String предоставляется здесь udf (getTimeFunction _). – bob87