首页 > 解决方案 > 在 sparklyr 中将 12 小时制转换为 24 小时制

问题描述

我正在尝试使用 sparklyr 将以下内容转换为 24 小时时间:

2021-05-18 9:00:00 PM

我的预期结果:2021-05-18 21:00:00

我努力了:

data %>% 
  mutate(datetime_24 = to_timestamp("datetime_12", "yyyy-MM-dd hh:mm:ss"))

data %>% 
  mutate(datetime_24 = to_date("datetime_12", "yyyy-MM-dd hh:mm:ss"))

两者都导致 NULL。

我尝试以下作为起点并收到此错误

data %>%
  mutate(datetime_24 = unix_timestamp(datetime_12, "yyyy-MM-dd hh:mm:ss"))

由于 Spark 3.0 的升级,您可能会得到不同的结果:Fail to parse '2021-05-18 9:00:00 PM' in the new parser。您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY 以恢复 Spark 3.0 之前的行为,或者设置为 CORRECTED 并将其视为无效的日期时间字符串。

我还在 pyspark 中尝试了以下操作,但遇到了类似的错误:

from pyspark.sql.functions import from_unixtime, unix_timestamp, col

df_time = spark.table("data")

df_time_new = df_time.withColumn('datetime_24', \
             from_unixtime(unix_timestamp(col(('datetime_12')), "yyyy-mm-dd hh:mm:ss"), "yyyy-mm-dd HH:mm:ss"))

错误:

由于 Spark 3.0 的升级,您可能会得到不同的结果:Fail to parse '2021-05-18 9:00:00 PM' in the new parser。您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY 以恢复 Spark 3.0 之前的行为,或者设置为 CORRECTED 并将其视为无效的日期时间字符串。原因:DateTimeParseException:无法在索引 11 处解析文本“2021-05-18 9:00:00 PM”

标签: pythonrapache-sparkpysparksparklyr

解决方案


您可以将 spark.sql.legacy.timeParserPolicy 设置为 LEGACY,如下所示:

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

在此之后,您在解析日期时间时不应出现错误。

由于 spark v3.0(阅读此处)中与日期时间解析器相关的一些更改,因此您会收到该错误。

在此处阅读日期时间模式。据此,您可以使用模式“a”进行 PM 或 AM 解析。

to_date("datetime_12", "yyyy-MM-dd hh:mm:ss a")

推荐阅读