使用Glue Dynamic Frame API resolveChoice转日期遇空值,求指定源格式方法
解决Glue DynamicFrame resolveChoice日期转换为空的问题
这个问题我之前也碰到过!当你用cast:date做类型转换时,Glue默认只会识别ISO标准的日期格式(比如yyyy-MM-dd或者yyyy-MM-dd'T'HH:mm:ss),如果你的col2_date字段的源格式不是这种,就会解析失败返回空值。
要解决这个问题,你需要在转换时显式指定源日期的格式,下面给你两种实用的方法:
方法一:在resolveChoice中用自定义转换逻辑
直接在specs里调用Spark的to_date函数,传入你的源日期格式,这样就能精准解析了:
from pyspark.sql.functions import to_date # 替换成你实际的源日期格式,比如'dd/MM/yyyy'、'yyyy-MM-dd HH:mm:ss'等 self.df_TR01 = self.df_TR01.resolveChoice( specs=[ ('col1', 'cast:string'), ('col2_date', lambda x: to_date(x, 'dd/MM/yyyy')) ] ).toDF()
如果你的Spark版本是3.0及以上,还可以用try_to_date函数来容错——碰到格式不规范的日期不会直接返回空,而是保留可解析的记录:
from pyspark.sql.functions import try_to_date self.df_TR01 = self.df_TR01.resolveChoice( specs=[ ('col1', 'cast:string'), ('col2_date', lambda x: try_to_date(x, 'dd/MM/yyyy')) ] ).toDF()
方法二:用applyMapping替代resolveChoice(更直观)
如果你的DynamicFrame是从数据 Catalog 创建的,用applyMapping来定义字段映射和日期格式会更清晰,适合字段较多的场景:
self.df_TR01 = self.df_TR01.applyMapping( mappings=[ # 格式:(源字段名, 源字段类型, 目标字段名, 目标字段类型, 可选参数) ('col1', 'int', 'col1', 'string'), # 替换成col1实际的源类型 ('col2_date', 'string', 'col2_date', 'date', {"dateFormat": "dd/MM/yyyy"}) ] ).toDF()
注意事项
- 一定要确保你指定的格式和源数据的日期格式完全匹配,比如源数据是
2024-05-20就用yyyy-MM-dd,是20/05/2024就用dd/MM/yyyy,大小写敏感(MM代表月份,mm代表分钟)。 - 如果源数据里有大量格式不规范的日期,建议先做数据清洗,避免转换后出现过多空值。
内容的提问来源于stack exchange,提问作者Anaadih.pradeep
相关产品推荐
相关产品推荐

