AWS Glue 工作室将 Pyspark 字符串列转换为日期返回 null

问题描述 投票:0回答:3

我有来自 S3 存储桶的数据,并且想要将日期列从字符串转换为日期。当前日期列的格式为

7/1/2022 12:0:15 AM
.

我在 AWS Glue Studio 中使用的当前代码来尝试自定义转换:

MyTransform (glueContext, dfc) -> DynamicFrameCollection:
      from pyspark.sql.functions import col, to_timestamp
      df = dfc.select(list(dfc.keys())[0]).toDF()
      df = df.withColumn('Date',to_timestamp(col("Date"), 'MM/dd/yyyy HH:MM:SS'))
      df_res = DynamicFrame.fromDF(df, glueContext, "df")
      return(DynamicFrameCollection({"CustomTransform0": df_res}, glueContext))

使用

MM/dd/yyyy HH:MM:SS
日期格式,它会运行,但为日期列返回 null。当我尝试除此之外的任何其他日期格式时,都会出错。我怀疑日期格式可能是问题,但我不确定。

amazon-s3 pyspark etl aws-glue amazon-athena
3个回答
0
投票

将字符串转换为时间戳后,您需要将其转换为日期类型,如下所示:

df = df.withColumn(df_col, df[df_col].cast("date"))


0
投票

我们最终删除了日期格式的

HH:MM:SS
部分,这满足了我们的需求。如果有人能弄清楚如何让小时、分钟、秒和 AM/PM 工作,我仍然会很感兴趣,但我们现在可以不用了。


0
投票

我遇到了类似的问题,无法使用 AWS Glue 作业、自定义转换块中的

01/31/2023
 函数将字符串 
to_date
转换为日期。

启用

timeParserPolicy
的旧模式是我的案例的正确解决方案。

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

您可以使用更正的模式撤消它(如有必要):

spark.conf.set('spark.sql.legacy.timeParserPolicy', 'CORRECTED')

我根据您问题的输入制作了这个演示,它可能会有所帮助。

有关此问题的一些参考:

© www.soinside.com 2019 - 2024. All rights reserved.