我想将一个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\\', '}']
答案 0 :(得分:0)
你需要将你的json放在双引号中,并使用正确的转义:"{\"abc\":\"123\"}"
但是你的输入可能会在传递给你的脚本之前被处理Hadoop。
如果这不起作用,您可以尝试通过环境-cmdenv name=value
传递参数。有关详细信息,请参阅How do I pass a parameter to a python Hadoop streaming job?。