AWS Glue开发端点ETL任务报错:原正常代码现运行失败
搞定AWS Glue ETL里的日期解析报错问题
嘿,我来帮你排查这个突然冒出来的报错问题~先看你的代码,有两个关键问题需要修复:
1. 先搞定语法错误
你创建DataFrame的时候,两个元组之间漏了逗号,这是最基础的语法问题,直接会导致代码跑不起来:
# 原来的错误写法 df1= sqlContext.createDataFrame([("11/25/1991","11/24/1991","11/30/1991") ("11/25/1391","11/24/1992","11/30/1992")], schema=['first', 'second', 'third']) # 修正后(给两个元组之间加个逗号) df1= sqlContext.createDataFrame([ ("11/25/1991","11/24/1991","11/30/1991"), ("11/25/1391","11/24/1992","11/30/1992") ], schema=['first', 'second', 'third'])
2. 处理日期解析的异常
除了语法问题,你的UDF还会因为"11/25/1391"这个日期报错——因为AWS Glue用的DateType底层是Java的java.sql.Date,它只支持1900到9999年的日期,1391年早于1900,直接就触发解析异常了。
给你两种解决思路:
思路一:给UDF加异常处理
自己写个带容错的日期解析函数,遇到无效日期返回null或者默认值:
from pyspark.sql.functions import udf, col from pyspark.sql.types import DateType from datetime import datetime def safe_parse_date(date_str): try: dt = datetime.strptime(date_str, '%m/%d/%Y') # 检查年份是否在有效范围内 if 1900 <= dt.year <= 9999: return dt.date() else: return None except (ValueError, TypeError): # 处理格式错、空值这些情况 return None # 注意udf和括号之间别留空格哦 func = udf(safe_parse_date, DateType()) df = df1.withColumn('test', func(col('first'))) df.show()
思路二:用Spark内置函数更高效
其实Spark有现成的to_date函数,比自定义UDF性能好,还自带容错,无效日期直接返回null:
from pyspark.sql.functions import to_date # 用内置函数替代UDF,省心又高效 df = df1.withColumn('test', to_date(col('first'), 'MM/dd/yyyy')) df.show()
额外小建议
如果你的数据源里经常有这种奇怪的日期,建议先做一步数据清洗,提前过滤掉无效数据,或者统一转换格式,避免后续ETL环节出问题~
内容的提问来源于stack exchange,提问作者Basanta
相关产品推荐
相关产品推荐

