AWS Glue中DynamicFrame.map执行后返回0行的问题求助
AWS Glue中DynamicFrame.map执行后返回0行的问题求助
看起来你碰到了一个很典型的Glue隐性问题——明明没有报错,但map操作后所有记录都消失了,这十有八九是你的转换函数里触发了未被捕获的异常,而Glue的DynamicFrame.map默认会悄悄丢弃产生异常的记录,不会主动抛出错误。
咱们来拆解你的问题:
你的UpdateRec函数里执行了rec["LoanNumber"] + " IS INVALID"这个拼接操作,如果原始数据里的LoanNumber字段存在null值(或者不是字符串类型),在Python里尝试把None和字符串相加会直接触发TypeError。但Glue不会把这个异常抛出来给你看,而是直接把这条出问题的记录过滤掉。如果你的5条记录的LoanNumber全是null,那最终自然就得到0行结果了——这也解释了为什么注释掉那行代码后,所有记录都能正常返回。
给你几个解决思路:
1. 提前处理空值,避免异常
修改你的转换函数,先判断LoanNumber是否为空,再执行拼接:
def UpdateRec(rec): loan_number = rec.get("LoanNumber") # 处理空值或非字符串情况 if loan_number is not None: rec["LoanNumber_ERROR"] = f"{loan_number} IS INVALID" else: rec["LoanNumber_ERROR"] = "LOAN NUMBER IS MISSING/INVALID" return rec
2. 使用安全的字符串转换
用str()强制转换LoanNumber,即使是None也会被转成字符串"None",避免异常:
def UpdateRec(rec): rec["LoanNumber_ERROR"] = f"{str(rec['LoanNumber'])} IS INVALID" return rec
3. 调试定位问题根源
你可以在Glue Studio Notebook里给转换函数加个调试逻辑,直接打印每条记录和可能的错误,这样能精准定位问题:
def UpdateRec(rec): print(f"Processing record: {rec}") try: rec["LoanNumber_ERROR"] = rec["LoanNumber"] + " IS INVALID" except Exception as e: print(f"Error occurred: {str(e)}, problematic record: {rec}") return rec
另外,你还可以利用Glue的错误捕获机制查看被丢弃的记录:
final_dyf = my_dyf.map(f=UpdateRec, transformation_ctx="map_transformation") # 获取所有被过滤的错误记录 error_records = final_dyf.getErrors() # 查看错误详情 error_records.show()
先试试调试打印,确认LoanNumber字段是不是真的有大量空值,然后根据情况调整转换函数,应该就能解决行数为0的问题了。
备注:内容来源于stack exchange,提问作者Louis Cribbins
相关产品推荐
相关产品推荐

