当前位置:  开发笔记 > 编程语言 > 正文

处理Spark Scala中的微秒

如何解决《处理SparkScala中的微秒》经验,为你挑选了1个好方法。

我使用Scala将PostgreSQL表导入spark作为数据帧.数据框看起来像

user_id | log_dt  
--------| -------    
96      | 2004-10-19 10:23:54.0    
1020    | 2017-01-12 12:12:14.931652

我正在转换此数据帧以使log_dt的数据格式为yyyy-MM-dd hh:mm:ss.SSSSSS.为了实现这一点,我使用以下代码使用unix_timestamp函数将log_dt转换为时间戳格式.

  val tablereader1=tablereader1Df.withColumn("log_dt",unix_timestamp(tablereader1Df("log_dt"),"yyyy-MM-dd hh:mm:ss.SSSSSS").cast("timestamp"))

当我打印使用命令打印tablereader1数据帧时,tablereader1.show()我得到以下结果

user_id | log_dt  
--------| -------
96      | 2004-10-19 10:23:54.0
1020    | 2017-01-12 12:12:14.0

如何将微秒保留为时间戳的一部分?任何建议表示赞赏.



1> mrsrinivas..:

千禧年 date_format()

您可以使用date_format()接受Java SimpleDateFormat模式的Spark SQL .SimpleDateFormat只能使用模式"S"解析直到milleseconds .

import org.apache.spark.sql.functions._
import spark.implicits._ //to use $-notation on columns

val df = tablereader1Df.withColumn("log_dt", date_format($"log_dt", "S"))

更新:使用Java 8的LocalDateTime的微秒
//Imports
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;

/* //Commented as per comment about IntelliJ
spark.udf.register("date_microsec", (dt: String) => 
   val dtFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.n")
   LocalDateTime.parse(dt, dtFormatter).getLong(ChronoField.MICRO_OF_SECOND)
)
*/

import org.apache.spark.sql.functions.udf

val date_microsec = udf((dt: String) => {
    val dtFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.n")
    LocalDateTime.parse(dt, dtFormatter).getLong(ChronoField.MICRO_OF_SECOND)
})

检查:帮助构建DateTimeFormatter模式

使用ChronoField.NANO_OF_SECOND而不是ChronoField.MICRO_OF_SECOND在UDF中获取纳秒.

val df = tablereader1Df.withColumn("log_date_microsec", date_microsec($"log_dt"))

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有