Pyspark 将带有日期和月份名称的日期时间字段解析为时间戳

Pyspark parse datetime field with day and month names into timestamp

我什至不知道从哪里开始。我想将当前为字符串的列解析为时间戳。记录如下所示:

Thu, 28 Jan 2021 02:54:17 +0000

将其解析为时间戳的最佳方法是什么?我什至不确定从哪里开始,因为它不是存储日期的超级常用方法

您或许可以从文档开始 Datetime Patterns for Formatting and Parsing:

import pyspark.sql.functions as F

df = spark.createDataFrame([("Thu, 28 Jan 2021 02:54:17 +0000",)], ['timestamp'])

df.withColumn(
    "timestamp",
    F.to_timestamp("timestamp", "E, dd MMM yyyy HH:mm:ss Z")
).show()

#+-------------------+
#|          timestamp|
#+-------------------+
#|2021-01-28 02:54:17|
#+-------------------+

但是,从 Spark 3.0 版本开始,在解析到时间戳时,您不能再使用 E 等符号:

Symbols of ‘E’, ‘F’, ‘q’ and ‘Q’ can only be used for datetime formatting, e.g. date_format. They are not allowed used for datetime parsing, e.g. to_timestamp.

您可以将时间解析器设置为旧版:

spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")

或者在使用 to_timestamp 之前使用一些字符串函数从字符串中删除日期部分:

df.withColumn(
    "timestamp",
    F.to_timestamp(F.split("timestamp", ",")[1], " dd MMM yyyy HH:mm:ss Z")
).show()