【问题标题】:EDIT: spark scala inbuilt udf : to_timestamp() ignores the millisecond part of the timestamp value编辑:spark scala 内置 udf:to_timestamp() 忽略时间戳值的毫秒部分
【发布时间】:2023-03-27 12:20:01
【问题描述】:

示例代码:

val sparkSession = SparkUtil.getSparkSession("timestamp_format_test")

import sparkSession.implicits._

val format = "yyyy/MM/dd HH:mm:ss.SSS"
val time = "2018/12/21 08:07:36.927"

val df = sparkSession.sparkContext.parallelize(Seq(time)).toDF("in_timestamp")

val df2 = df.withColumn("out_timestamp", to_timestamp(df.col("in_timestamp"), format))

输出:

df2.show(false)

请注意:out_timestamp 会丢失原始值的毫秒部分

+-----------------------+-------------------+
|in_timestamp           |out_timestamp      |
+-----------------------+-------------------+
|2018/12/21 08:07:36.927|2018-12-21 08:07:36|
+-----------------------+-------------------+

df2.printSchema()

root
 |-- in_timestamp: string (nullable = true)
 |-- out_timestamp: timestamp (nullable = true)

在上面的结果中:in_timestamp 是字符串类型,我想转换为时间戳数据类型,它确实转换但毫秒部分丢失了。任何的想法。?谢谢!

【问题讨论】:

  • 奇怪的是这还没有解决。 OP 的代码有效,如果他使用不采用格式说明符的 to_timestamp 函数。因为这也是 spark 中使用的默认格式。
  • @Nayan,那些没有帮助,与我的场景不匹配,请提出一些解决方案。!

标签: scala apache-spark apache-spark-sql


【解决方案1】:

在从字符串到时间戳的转换过程中保留毫秒的示例代码。

val df2 = df.withColumn("out_timestamp", to_timestamp(df.col("in_timestamp")))

df2.show(false)

+-----------------------+-----------------------+
|in_timestamp           |out_timestamp          |
+-----------------------+-----------------------+
|2018-12-21 08:07:36.927|2018-12-21 08:07:36.927|
+-----------------------+-----------------------+


scala> df2.printSchema
root
 |-- in_timestamp: string (nullable = true)
 |-- out_timestamp: timestamp (nullable = true)

您只需要从 to_timestamp 中删除格式参数。这将使用类似于字符串值的数据类型时间戳保存您的结果。

【讨论】:

  • 感谢 Mahesh 的有用回答,!但答案仅适用于数据为 ISO 格式的情况。因此,我编辑/更新了输入数据及其格式,实际上这是我的实际问题。请提出一些建议
  • @Manoranjan 我没有任何直接的方法来转换和保存毫秒,但有一种方法可以解决您的问题,希望对您有所帮助。 var df2 = df.withColumn("out_timestamp",to_timestamp(regexp_replace(col("in_timestamp"),"/","-"))) 它也解决了您的目的,请接受其他答案,如果您有任何疑问,请告诉我
  • 感谢您的建议,(+1) 回答和评论,但很遗憾地说,但我的问题仍然悬而未决,尚未完全回答。用“-”替换“/”只是临时修复,如果我们有多种模式,这种替换机制将不起作用,因此,我已经在我的本地设置了来自 github 的 apache spark 开源代码,现在我我计划围绕这个 api 进行实验,这样我就可以找到 spark 的行为方式并提出任何更正或解决这个问题的建议。感谢您的努力,我承认并感谢您。 :) 编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多