【问题标题】:How to resolve Micro second in 'MM/dd/yyyy HH:mm:ss.SSS' format in Spark- Sql如何在 Spark-Sql 中以 'MM/dd/yyyy HH:mm:ss.SSS' 格式解析微秒
【发布时间】:2021-12-17 15:49:34
【问题描述】:
 spark.sql("select case when trim(map('OPT OUT',1,'OPT IN',0,'',0)[coalesce(upper(program_1),'')]) == trim(num_fg) then trim(from_unixtime(unix_timestamp(upd_dt,'MM/dd/yyyy HH:mm:ss.SSS'), 'yyyy-MM-dd HH:mm:ss.sss')) else Now() end as upd_dt from input").show(false)

输入

val sample = Seq(("OPT OUT","1","07/21/2020 09:09:09.382")).toDF("program_1","num_fg", "upd_dt")

在上述书面查询中,微秒 'sss' 没有返回我们提供的输入。

如果输入是07/21/2020 09:09:09.382,它会返回07/21/2020 09:09:09.009,但预期的结果是07/21/2020 09:09:09.382 [无论我们在输入中给出多少微秒,它都应该在输出中显示]。

【问题讨论】:

标签: sql dataframe apache-spark apache-spark-sql


【解决方案1】:

这会有所帮助

 import java.sql.Timestamp
 import java.time.LocalDateTime
 import java.time.format.DateTimeFormatter

 def dateWithMilliSeconds (rawDate:String) = {
  val format = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss.SSS")
  Timestamp.valueOf(LocalDateTime.parse(rawDate.trim,format))
 }

spark.udf.register("dateWithMilliSeconds",dateWithMilliSeconds _)

spark.sql("select 
             case when trim(map('OPT OUT',1,'OPT IN',0,'',0 [coalesce(upper(program_1),'')]) == trim(num_fg) 
             then dateWithMilliSeconds(upd_dt) 
             else Now() end as upd_dt 
           from input
           ").show(false)

OUTPUT:
+-----------------------+
|upd_dt                 |
+-----------------------+
|2020-07-21 09:09:09.382|
+-----------------------+

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多