我用一些元数据创建了一个名为my_dict的python字典。我通过json.dumps()
将my_dict转换为字符串。my_dict然后通过add_job_flow_steps
作为HadoopJarStep中的参数传递给EMR。
一旦提交了步骤,UI中EMR步骤的Arguments部分中的参数如下所示:
--my_dict "{"level_one_key": {"level_two_key": "level_two_value"}}"
现在,我还向EMR传递一个名为execute.py
的python文件以运行。上述参数被传递到execute.py
的main函数中,在那里它立即被json.loads()
转换成一个字典。它看起来像:
parser.add_argument('--my_dict', type=json.loads, required=False)
问题:当我传递一个嵌套字典时,步骤在20秒后失败,原因是未知错误,并且没有写入任何日志。(
但是当我把它作为一个平面字典传递时,比如:
--my_dict "{"level_one_key": "level_one_value"}"
它工作得很好。
我不想发布太多我的代码,因为这是工作相关的。但我错过了什么吗?我觉得我应该能够传递一个嵌套字典,没有问题。我也试过转换字典后,它被传递给main,像这样:parser.add_argument('--my_dict', type=str, required=False)
my_dict = json.loads(args.my_dict)
然而它仍然失败了。什么好主意吗?
更新:当嵌套字典在execute.py中作为STR解析后(与使用json.loads相反)打印出来时,它看起来像:
{"level_one_key": {"level_two_key": "level_two_value"
缺少字典的最后两个括号…不管出于什么原因。显然,这会导致错误,但我不知道为什么不将整个字典传递给main。
我可以通过在字典末尾添加另一个未嵌套的键值对来解决这个问题。这样的:
--my_arg "{"level_one_key": {"level_two_key": "level_two_value"}, "level_one_second_key": "level_one_second_value"}"