当前位置: 首页 > 面试题库 >

在Spark Scala中处理微秒

毛博
2023-03-14
问题内容

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

您可以使用date_format()接受Java
SimpleDateFormat模式的Spark
SQL 。SimpleDateFormat只能 使用模式“ S” 解析到毫秒。

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


 类似资料:
  • 本文向大家介绍在8085微处理器中模拟秒表的程序,包括了在8085微处理器中模拟秒表的程序的使用技巧和注意事项,需要的朋友参考一下 我们编写8085汇编语言程序只是为了模拟一个秒表,以在地址字段中显示分钟和秒。提供了停止秒表的功能,以及用于继续显示秒表的时间,以显示恰好在停止命令之前的时间。

  • 本文向大家介绍8085微处理器中的BCD编号,包括了8085微处理器中的BCD编号的使用技巧和注意事项,需要的朋友参考一下 很多时候,我们需要在计算机中表示十进制数字,并对这些数字进行算术运算。例如,可能会要求我们对学生在五个不同科目中获得的分数进行总计,显然,分数以十进制表示。 为此,广泛使用了BCD代码。在BCD表示法中,4位用于对一个数字进行编码,因此,两位的信息存储在一个字节中。例如,十进

  • 本文向大家介绍8085微处理器中的提示模式,包括了8085微处理器中的提示模式的使用技巧和注意事项,需要的朋友参考一下 之前我们已经看到,链接器以三种模式调用,即命令行模式,提示模式和数据文件模式。在提示模式下,只需键入“ LINK85 <cr>”即可运行链接器。响应提示,链接器向用户请求文件名。在给定的示例中,使用'MULT.OBJ <cr>'进行响应实际上就是MULT <cr>足够了。 链接器

  • 本文向大家介绍8085微处理器中的命令模式,包括了8085微处理器中的命令模式的使用技巧和注意事项,需要的朋友参考一下 前面我们已经看到,链接器以三种模式调用,即命令行模式,提示模式和数据文件模式。为了使链接器在此模式下运行,我们键入“ LINK85 -C MULT.OBJ <cr>”以及地址更改。在上面的命令中,仅使用“ MULT”就足够了,而不是使用命令“ MULT.OBJ”。我们可以通过以下

  • 我现在读了很多关于微服务的书,但仍然不了解其中的一些部分。我画了以下图: 每个微服务有2个访问: REST:对于超文本传输协议使用 gRPC:用于内部/后台通信/交换 如果我想登录,我可以向我的身份验证服务发送一个Http请求。但是,如果我想访问需要您连接的Stuff服务,该怎么办? 假设用户希望显示数据库中可用的内容,服务人员将首先通过与身份验证服务交换来检查连接用户的“令牌”是否正确,然后返回

  • 我已经成功训练了一个超过100000个样本的模型,该模型在训练集和测试集都表现良好。然后,我尝试对一个特定样本(100000个样本中的一个)进行微调,并使用经过训练的权重作为初始化。 但结果有点奇怪,我相信这是由批处理规范化层引起的。具体而言,我的代码可以列出如下: model.load_weights速率=model.evaluate(x, y)打印速率 mymodel是一个自定义函数来生成我的