Запускает udf для чтения нетрадиционных форматов даты

#scala #apache-spark #user-defined-functions

#scala #apache-spark #определяемые пользователем функции

Вопрос:

Допустим, у меня есть нетрадиционные даты в моем фрейме данных spark:

 val df = Seq("24-12-2017","25-01-2016").toDF("dates")
df.show()
 ---------- 
|     dates|
 ---------- 
|24-12-2017|
|25-01-2016|
  

Затем я хочу разобрать эти даты на временные метки, и это не работает:

 import java.text.SimpleDateFormat
def fmt(d:String) = {
    val f = new SimpleDateFormat("dd-MM-yyyy")
    f.parse(d)
}
val reFormat = udf(fmt(_:String):Timestamp)
cmd15.sc:1: not found: type Timestamp
val reFormat = udf{fmt(_:String):Timestamp}
  

Чего я не понимаю? Любая помощь приветствуется!!!

Ответ №1:

Ошибка, которую вы получаете, просто связана с тем, что java.sql.Timestamp не импортировано. Тем не менее, его импорт просто привел бы к другой проблеме:

 error: type mismatch;
found   : java.util.Date
required: java.sql.Timestamp
  

Чтобы исправить это, вам просто нужно создать java.sql.Timestamp в вашем UDF:

 def fmt(d:String) = {
    val ts = new SimpleDateFormat("dd-MM-yyyy").parse(d).getTime
    new java.sql.Timestamp(ts)
}
val reFormat = udf(fmt(_:String):java.sql.Timestamp)

df.select('dates, reFormat('dates)).show
 ---------- ------------------- 
|     dates|         UDF(dates)|
 ---------- ------------------- 
|24-12-2017|2017-12-24 00:00:00|
|25-01-2016|2016-01-25 00:00:00|
 ---------- ------------------- 
  

Это исправляет ваш UDF, но обратите внимание, что в SparkSQL API есть функция, которая делает именно то, что вы хотите:

 df.select('dates, to_timestamp('dates, "dd-MM-yyyy")).show
 ---------- ----------------------------------- 
|     dates|to_timestamp(`dates`, 'dd-MM-yyyy')|
 ---------- ----------------------------------- 
|24-12-2017|                2017-12-24 00:00:00|
|25-01-2016|                2016-01-25 00:00:00|
 ---------- ----------------------------------- 
  

Комментарии:

1. Потому что я хотел udf. Если вы видите простой маршрут, использующий udf — добро пожаловать!