【问题标题】:Pyspark converting string to UTC timestamp [Getting null]Pyspark 将字符串转换为 UTC 时间戳 [获取 null]
【发布时间】:2021-07-24 03:14:20
【问题描述】:

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

数据帧格式:

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

现在,我查看this post并尝试了以下代码sn-p:

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 作为时间戳的输出!

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

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

【问题讨论】:

    标签: apache-spark pyspark timestamp unix-timestamp


    【解决方案1】:

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

    代码sn-p:

    result = result.withColumn("time_from_text", substring(col("time_from_text"),0,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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多