我有来自 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。当我尝试除此之外的任何其他日期格式时,都会出错。我怀疑日期格式可能是问题,但我不确定。
将字符串转换为时间戳后,您需要将其转换为日期类型,如下所示:
df = df.withColumn(df_col, df[df_col].cast("date"))
我们最终删除了日期格式的
HH:MM:SS
部分,这满足了我们的需求。如果有人能弄清楚如何让小时、分钟、秒和 AM/PM 工作,我仍然会很感兴趣,但我们现在可以不用了。
我遇到了类似的问题,无法使用 AWS Glue 作业、自定义转换块中的
01/31/2023
函数将字符串
to_date
转换为日期。
启用
timeParserPolicy
的旧模式是我的案例的正确解决方案。
spark.conf.set('spark.sql.legacy.timeParserPolicy', 'LEGACY')
您可以使用更正的模式撤消它(如有必要):
spark.conf.set('spark.sql.legacy.timeParserPolicy', 'CORRECTED')
我根据您问题的输入制作了这个演示,它可能会有所帮助。
有关此问题的一些参考: