【问题标题】:spark date format MMM dd, yyyy hh:mm:ss AM to timestamp in df火花日期格式 MMM dd, yyyy hh:mm:ss AM 到 df 中的时间戳
【发布时间】:2019-04-17 16:25:17
【问题描述】:

我需要将描述性日期格式从日志文件“MMM dd, yyyy hh:mm:ss AM/PM”转换为 spark 时间戳数据类型。我尝试了类似下面的方法,但它给出了 null。

val df = Seq(("Nov 05, 2018 02:46:47 AM"),("Nov 5, 2018 02:46:47 PM")).toDF("times")
df.withColumn("time2",date_format('times,"MMM dd, yyyy HH:mm:ss AM")).show(false)

+------------------------+-----+
|times                   |time2|
+------------------------+-----+
|Nov 05, 2018 02:46:47 AM|null |
|Nov 5, 2018 02:46:47 PM |null |
+------------------------+-----+

预期输出

+------------------------+----------------------------+
|times                   |time2                       |
+------------------------+-----+----------------------+
|Nov 05, 2018 02:46:47 AM|2018-11-05 02:46:47.000000" |
|Nov 5, 2018 02:46:47 PM |2018-11-05 14:46:47.000000" |
+------------------------+-----+----------------------+

转换它的正确格式是什么?请注意,DD 可能有前导零。

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    这是你的答案

    val df = Seq(("Nov 05, 2018 02:46:47 AM"),("Nov 5, 2018 02:46:47 PM")).toDF("times")
    
    scala> df.withColumn("times2", from_unixtime(unix_timestamp(col("times"), "MMM d, yyyy hh:mm:ss a"),"yyyy-MM-dd HH:mm:ss.SSSSSS")).show(false)
        +------------------------+--------------------------+
        |times                   |times2                    |
        +------------------------+--------------------------+
        |Nov 05, 2018 02:46:47 AM|2018-11-05 02:46:47.000000|
        |Nov 5, 2018 02:46:47 PM |2018-11-05 14:46:47.000000|
        +------------------------+--------------------------+
    

    如果您想解析 12 小时格式,请使用 hh 代替 HH。解析时,am/pm 也用后缀“a”表示。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      使用 to_timestamp 和 date_format 函数

      scala> df.withColumn("times2",to_timestamp('times,"MMM d, yyyy hh:mm:ss a")).show(false)
      +------------------------+-------------------+
      |times                   |times2             |
      +------------------------+-------------------+
      |Nov 05, 2018 02:46:47 AM|2018-11-05 02:46:47|
      |Nov 5, 2018 02:46:47 PM |2018-11-05 14:46:47|
      +------------------------+-------------------+
      
      
      scala> df.withColumn("times2",date_format(to_timestamp('times,"MMM d, yyyy hh:mm:ss a"),"yyyy-MM-dd HH:mm:ss.SSSSSS")).show(false)
      +------------------------+--------------------------+
      |times                   |times2                    |
      +------------------------+--------------------------+
      |Nov 05, 2018 02:46:47 AM|2018-11-05 02:46:47.000000|
      |Nov 5, 2018 02:46:47 PM |2018-11-05 14:46:47.000000|
      +------------------------+--------------------------+
      
      
      scala>
      

      【讨论】:

      • 嘿,我在我的 pysaprk 中使用上面的代码,但它给了我空值
      【解决方案3】:

      使用 SQL 语法:

      select date_format(to_timestamp(ColumnTimestamp, "MM/dd/yyyy hh:mm:ss aa"), "yyyy-MM-dd") as ColumnDate 
      from database_name.table_name
      

      【讨论】:

        【解决方案4】:

        我们可以使用splitby

        Select date.split('-')[2]||'-'||case when length(date.split('-')[0]) = 1 then '0'||date.split('-')[0] else  date.split('-')[0] end  || case when length(date.split('-')[1]) = 1 then '0'||date.split('-')[1] else  date.split('-')[1] end] 
        Date = date_column
        

        日期格式yyyy-mm-dd
        分隔符可以不同。

        没有任何日期格式

        【讨论】:

        • 它可能有效,但一项艰巨的任务..
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多