在 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) 中将时间戳转换为字符串而不会丢失毫秒的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark 2 Scala 中将 Row 转换为 json
如何在 Spark Scala 中将 WrappedArray 转换为 List?