假设我在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}
我想念什么?任何帮助表示赞赏!!!
答案 0 :(得分:3)
您收到的错误仅是由于未导入java.sql.Timestamp
造成的。但是,导入它只会导致一个不同的问题:
error: type mismatch; found : java.util.Date required: java.sql.Timestamp
要解决此问题,您只需要在UDF中创建一个java.sql.Timestamp
:
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|
+----------+-----------------------------------+