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

Posted

技术标签:

【中文标题】通过 add_job_flow_steps 将嵌套字典传递给 EMR【英文标题】:Passing Nested Dictionary to EMR via add_job_flow_steps 【发布时间】:2021-10-22 03:59:39 【问题描述】:

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

提交步骤后,用户界面中 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 秒内失败,原因是 UNKOWN ERROR,并且没有写入任何日志。 :(

但是,当我将它作为平面字典传递时,例如:

--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。

【问题讨论】:

你能在解析后打印出你的字典并确保它被正确解析吗? @KyleParsons - 我添加了打印输出。 【参考方案1】:

我能够通过在未嵌套的字典末尾添加另一个键值对来解决此问题。像这样:

--my_arg "\"level_one_key\": \"level_two_key\": \"level_two_value\", \"level_one_second_key\": \"level_one_second_value\""

【讨论】:

以上是关于通过 add_job_flow_steps 将嵌套字典传递给 EMR的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单个语句将嵌套关系提取到数组中

C# + EntityFramework:通过查询将多个组转换为嵌套 JSON

如何通过 gson 将 json 反序列化为嵌套的自定义地图?

使用嵌套循环将日常工作列表通过电子邮件发送给每个收件人

将带有嵌套列表的列表转换为带有嵌套数据框的单行小标题

vue多层嵌套组件传值