AWS Lambda返回元组列表异常致Glue ApplyMapping报错求助
解决AWS Lambda返回元组列表转列表导致Glue ApplyMapping报错的问题
这个问题我之前也碰到过,核心原因是AWS Lambda的返回值会自动序列化为JSON格式,而JSON里根本没有元组(tuple)这个类型——所有的元组都会被转成列表(list),所以等你传到Glue Job那边,自然就变成了列表套列表的格式,不符合ApplyMapping对元组列表的要求。
下面给你几个实用的解决方法,都是针对动态传参场景设计的:
方案一:在Glue Job内部转换(最推荐)
既然没法让Lambda直接返回元组列表,那就在Glue Job拿到参数后,把列表再转回元组列表就行,代码非常简单:
假设你的Glue Job是通过Lambda触发,且mappings参数从事件(event)中获取,在Glue Job里添加这行转换代码:
# 从事件中拿到的是列表套列表格式的mappings received_mappings = event['mappings'] # 将每个子列表转换为元组 converted_mappings = [tuple(item) for item in received_mappings] # 正常传给ApplyMapping使用 ApplyMapping.apply( frame=your_data_frame, mappings=converted_mappings, # 其他必要参数... )
这个方法最省心,不需要修改Lambda的逻辑,只需要在Glue端加一行转换代码,完全不影响动态传参的需求。
方案二:Lambda调用Glue Job时通过Job Arguments传递
如果你的Lambda是直接调用Glue Job API(比如用boto3的start_job_run),可以把mappings序列化成JSON字符串,放到Job的自定义参数里,再在Glue Job里解析转换:
Lambda端代码
import boto3 import json # 你的元组列表 t1 = [('a', 'string', 'a', 'string'), ('b', 'string', 'b', 'string')] # 把元组列表转成JSON字符串(JSON会自动把元组转成列表,后续在Glue再转回来) mappings_str = json.dumps(t1) glue_client = boto3.client('glue') glue_client.start_job_run( JobName='你的Glue Job名称', Arguments={ '--mappings': mappings_str # 用--前缀定义自定义参数 } )
Glue Job端代码
import json import sys from awsglue.context import GlueContext from awsglue.transforms import ApplyMapping from awsglue.utils import getResolvedOptions glue_context = GlueContext(SparkContext.getOrCreate()) # 获取传入的自定义参数 args = getResolvedOptions(sys.argv, ['mappings']) # 解析JSON字符串,再将每个子列表转回元组 mappings = [tuple(item) for item in json.loads(args['mappings'])] # 后续正常使用ApplyMapping ApplyMapping.apply( frame=your_data_frame, mappings=mappings, # 其他必要参数... )
不推荐的方案:用pickle序列化
虽然可以用pickle把元组列表序列化成字节串,再转成base64字符串在Lambda和Glue之间传递,但这种方式存在安全风险(如果传递内容被篡改,可能执行恶意代码),而且代码复杂度更高,除非特殊场景,不建议使用。
本质上,问题的核心是JSON不支持元组类型,所以跨服务传递时必然会被转成列表,我们只需要在接收端(Glue Job)把列表再转回元组即可,这是最稳妥的解决思路。
内容的提问来源于stack exchange,提问作者nsc060
相关产品推荐
相关产品推荐

