在 Spark (Scala) 中将时间戳转换为字符串而不会丢失毫秒

Posted

技术标签:

【中文标题】在 Spark (Scala) 中将时间戳转换为字符串而不会丢失毫秒【英文标题】:Convert timestamp to string without loosing miliseconds in Spark (Scala) 【发布时间】:2021-07-19 11:52:23 【问题描述】:

我使用以下代码将日期/时间戳转换为具有特定格式的字符串:

when(to_date($"timestamp", fmt).isNotNull, date_format(to_timestamp($"timestamp", fmt), outputFormat))

“fmt”来自可能的格式列表,因为我们在源数据中有不同的格式。

这里的问题是,当我们应用“to_timestamp”函数时,毫秒部分会丢失。在不丢失毫秒细节的情况下,是否有任何其他可能的(并且不是过于复杂)的方法?

谢谢,

BR

【问题讨论】:

在应用 to_timestamp 之前转换为 long 将保留毫秒。 @jayrythium 你能详细说明一下吗? 【参考方案1】:

我记得在回来的时候不得不把它弄乱。这也可以。

df = (
        spark
            .createDataFrame(['2021-07-19 17:29:36.123', 
                              '2021-07-18 17:29:36.123'], "string").toDF("ts")
            .withColumn('ts_with_mili', 
                        (unix_timestamp(col('ts'), "yyyy-MM-dd HH:mm:ss.SSS") 
                         + substring(col('ts'), -3, 3).cast('float')/1000).cast('timestamp'))
    ).show(truncate=False)
    
    # +-----------------------+-----------------------+
    # |ts                     |ts_with_mili           |
    # +-----------------------+-----------------------+
    # |2021-07-19 17:29:36.123|2021-07-19 17:29:36.123|
    # |2021-07-18 17:29:36.123|2021-07-18 17:29:36.123|
    # +-----------------------+-----------------------+

【讨论】:

问题是我们有几种可能的日期格式,所以可能唯一的方法是创建一个函数,该函数将根据每种格式类型应用该子字符串。我相信没有其他选择 是的,多种数据格式肯定会限制选项。我知道还有另一种比上面更优雅的方法,如果我遇到它,我会发布。

以上是关于在 Spark (Scala) 中将时间戳转换为字符串而不会丢失毫秒的主要内容,如果未能解决你的问题,请参考以下文章

在scala中将Spark Dataframe转换为RDD

在 Hive 中将 Long 转换为时间戳

如何在 Spark 2 Scala 中将 Row 转换为 json

如何在 Spark Scala 中将 WrappedArray 转换为 List?

在scala中将spark决策树模型调试字符串转换为嵌套JSON

如何在 Apache Spark 中将 Scala UDF 转换为 Java 版本?