【问题标题】:Spark udf for reading unconventional date formats用于读取非常规日期格式的 Spark udf
【发布时间】:2019-03-25 09:02:19
【问题描述】:

假设我的 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}

我错过了什么?任何帮助表示赞赏!!!

【问题讨论】:

    标签: scala apache-spark user-defined-functions


    【解决方案1】:

    您得到的错误仅仅是因为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|
    +----------+-----------------------------------+
    

    【讨论】:

    • 因为我想要一个 udf。如果您看到使用 udf 的简单路线 - 不客气!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2020-07-04
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多