微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pyspark 将字符串转换为 UTC 时间戳 [Getting null]

如何解决Pyspark 将字符串转换为 UTC 时间戳 [Getting null]

我是 pyspark 和 Spark sql 的新手。我有一个数据框,其中一列包含字符串中的日期时间值,我需要将其转换/转换为时间戳。

数据帧格式:

+--------------------+------------------------------+
|               value|                time_from_text|
+--------------------+------------------------------+
|dummy               |2020-04-19T23:49:52.020000453Z|
|dummy               |2020-04-22T23:52:52.020000453Z|
+--------------------+------------------------------+

现在,我查看了 this post 并尝试了以下代码片段:

result.withColumn("Timestamp",unix_timestamp("time_from_text","yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'").cast(TimestampType()))

这在我之前的 Spark 版本是 3.1.1 的情况下确实有效。但是,我需要切换回 2.4.6,在这里,相同的代码给了我 null 作为时间戳的输出

我尝试了很多不同的方法,但无法投射时间戳。

任何指针将不胜感激。感谢您的帮助!

解决方法

这不是一个完美的答案,但我找到了一个快速的解决方法来完成转换。 不知何故,转换确实发生在格式“yyyy-MM-dd'T'HH:mm:ss”。因此,我截断了 time_from_text 列以失去亚秒级精度 [这对于这里的用例来说很好],然后转换为时间戳。

代码片段:

result = result.withColumn("time_from_text",substring(col("time_from_text"),19))
final_result = result.withColumn("Timestamp",unix_timestamp("time_from_text","yyyy-MM-dd'T'HH:mm:ss").cast(TimestampType())).orderBy("Timestamp")

原因:

我做了一些研究,我最好的猜测是在从 Spark SQL 3.0 升级到 3.1 的过程中,对 unix_timestamp 代码库进行了一些更改。因此,新版本支持格式“2020-04-19T23:49:52.020000453Z”,但不支持通过 DateTimeFormatter 在底层实现的旧版本。此外,旧版本导致无效日期时间模式为 null,而新版本将直接失败。

来源:https://spark.apache.org/docs/latest/sql-migration-guide.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。