将JSON参数作为字符串传递给python hadoop流应用程序

时间:2015-02-11 06:32:29

标签: python json hadoop hadoop-streaming

我想将一个JSON字符串作为命令行参数传递给我的reducer.py文件,但我无法这样做。

我执行的命令是:

hadoop jar contrib/streaming/hadoop-streaming.jar -file /home/hadoop/mapper.py -mapper 'mapper.py' -file /home/hadoop/reducer.py -reducer 'reducer.py {"abc":"123"}' -input /user/abc.txt -output /user/output/

当我在reducer.py中打印argv数组时,它显示输出为:

['/mnt/var/lib/hadoop/tmp/nm-local-dir/usercache/hadoop/appcache/application_1423459215008_0057/container_1423459215008_0057_01_000004/./reducer.py', '{', 'abc', ':', '123', '}']

第一个参数是reducer.py的路径,但我的第二个参数被双引号拆分。

我希望将第二个参数作为完整的JSON字符串来实现。例如:['/mnt/var/lib/hadoop/tmp/nm-local-dir/usercache/hadoop/appcache/application_1423459215008_0057/container_1423459215008_0057_01_000004/./reducer.py','{"abc":"123"}']

这样我就可以在reducer.py

中将该参数加载为Json

感谢任何帮助。谢谢!

编辑: 尝试使用命令转义JSON:

hadoop jar contrib/streaming/hadoop-streaming.jar -file /home/hadoop/mapper.py -mapper 'mapper.py' -file /home/hadoop/reducer.py -reducer 'reducer.py "{\"abc\":\"123\"}"' -input /user/abc.txt -output /user/output/

输出为:

['/mnt/var/lib/hadoop/tmp/nm-local-dir/usercache/hadoop/appcache/application_1423459215008_0058/container_1423459215008_0058_01_000004/./redu.py', '{\\', 'abc\\', ':\\', '123\\', '}']

1 个答案:

答案 0 :(得分:0)

你需要将你的json放在双引号中,并使用正确的转义:"{\"abc\":\"123\"}"但是你的输入可能会在传递给你的脚本之前被处理Hadoop。

如果这不起作用,您可以尝试通过环境-cmdenv name=value传递参数。有关详细信息,请参阅How do I pass a parameter to a python Hadoop streaming job?