在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
//Importsimport 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