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

passing JSON argument as a string to python hadoop streaming application

我想将 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\', '}']

您需要将 json 放在双引号内并进行适当的转义:"{\"abc\":\"123\"}" 但您的输入很可能会在传递给脚本之前经过 Hadoop 处理。

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