在Spark Scala中处理微秒

我使用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

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

回答:

回答:

您可以使用date_format()接受Java

SimpleDateFormat模式的Spark

SQL 。SimpleDateFormat只能 解析到毫秒。

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"))

以上是 在Spark Scala中处理微秒 的全部内容, 来源链接: utcz.com/qa/404659.html

回到顶部