通过 add_job_flow_steps 将嵌套字典传递给 EMR

Passing Nested Dictionary to EMR via add_job_flow_steps

我用一些元数据创建了一个名为 my_dict 的 python 字典。我通过 json.dumps() 将 my_dict 转换为字符串。 my_dict 然后通过 add_job_flow_steps 作为 HadoopJarStep 中的参数传递给 EMR。

提交步骤后,UI 中 EMR 步骤的参数部分中的参数如下所示:

--my_dict "{\"level_one_key\": {\"level_two_key\": \"level_two_value\"}}"

现在,我还向 运行 传递了一个名为 execute.py 的 python 文件给 EMR。上面的参数被传递到 execute.py 的主函数中,它立即被转换成带有 json.loads() 的字典。看起来像:

parser.add_argument('--my_dict', type=json.loads, required=False)

问题: 当我传递嵌套字典时,该步骤在 20 秒内失败,原因是未知错误且没有日志随便写的。 :(

然而,当我将其作为平面字典传递时,例如:

--my_dict "{\"level_one_key\": \"level_one_value\"}"

它工作得很好。

我不想 post 我的代码太多,因为这与工作相关。但是我错过了什么吗?我觉得我应该能够毫无问题地传递嵌套字典。我也试过在将字典传递给 main 后转换字典,如下所示:

parser.add_argument('--my_dict', type=str, required=False)

my_dict = json.loads(args.my_dict)

还是失败了。有什么想法吗?

更新: 当嵌套字典在解析为 str 后打印出来时(与使用 json.loads 相反)在 execute.py 中,它看起来像:

{"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\"}"