sql - 如何在 Spark-Sql 中以 'MM/dd/yyyy HH:mm:ss.SSS' 格式解析微秒
问题描述
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
[无论我们在输入中给出什么微秒,它都应该在输出中显示]。
解决方案
这将有助于
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|
+-----------------------+
推荐阅读
- database - 如何在 BigQuery 中显示存储过程的定义?
- angular - 使用 Angular Pipes 将一位数变成两位数
- python - Python列表中的不同
- laravel - 重命名迁移文件夹中的文件后,Laravel 未迁移
- php - 您好,有人可以向我解释一下这个 php $_SESSION 脚本吗?
- windows - VirtualHost 不适用于 localhost WAMP 服务器中的“.com”域
- soapui - SoapUI:当我在 JDBC 请求中进行更新后进行选择时,我看不到选择结果
- asp.net-mvc - 从 Razor 调用控制器操作方法(ASP.NET MVC,.netcore 3.x/5.x)
- python - sudo pip list:OpenSSL 问题
- sql - MS-ACCESS,加入 SQL 选择