Python创建HDFS JSON文件格式错误,问题根源何在?
问题分析与解决方案
你的问题主要出在Shell的引号解析和潜在的代码执行顺序上,咱们一步步拆解清楚:
1. 核心问题:Shell吃掉了JSON的双引号
你用echo "%s"的方式传递JSON字符串时,Shell会把外层的双引号当作命令的边界标记,而非内容的一部分。当json.dumps生成标准JSON字符串{"a":"b"}被代入%s后,Shell会自动解析字符串里的双引号——它会误认为这些双引号是用来包裹Shell参数的,最终实际输出到HDFS的内容就丢失了双引号,变成了{a:b}。
另外看你给出的代码顺序:
os.system('echo "%s" | hadoop fs -put -f - /app/hdp/logs/json/a.json' %(json_string)) json_string=json.dumps({"a":"b"})
这里还有个明显的逻辑错误:你在调用os.system时,json_string还没被赋值!不过你说文件已经创建了,应该是实际代码里顺序反过来了,但这个细节还是要注意避免。
2. 修复方案
方案一:用单引号包裹echo的内容
把echo的外层引号换成单引号,这样Shell就不会解析里面的双引号,能完整传递JSON字符串给Hadoop命令:
json_string = json.dumps({"a":"b"}) os.system('echo \'%s\' | hadoop fs -put -f - /app/hdp/logs/json/a.json' % (json_string))
这里用转义的单引号\',是为了避免和字符串外层的单引号冲突。
方案二:用subprocess模块替代os.system(更推荐)
os.system在处理复杂字符串时很容易出现转义问题,用subprocess可以直接绕开Shell解析的坑,比如用管道传递数据:
import subprocess import json json_string = json.dumps({"a":"b"}) # 分步骤执行命令,避免Shell解析干扰 proc_echo = subprocess.Popen(['echo', json_string], stdout=subprocess.PIPE) proc_hadoop = subprocess.run(['hadoop', 'fs', '-put', '-f', '-', '/app/hdp/logs/json/a.json'], stdin=proc_echo.stdout) proc_echo.wait()
或者更简洁的写法,直接用input参数传递JSON字符串,彻底抛弃echo:
subprocess.run(f'hadoop fs -put -f - /app/hdp/logs/json/a.json', input=json_string.encode(), shell=True)
方案三:使用HDFS Python客户端(最可靠)
如果经常和HDFS交互,推荐用专门的Python库,比如hdfs或者pyarrow,完全不用依赖Shell命令,代码更清晰也更安全:
from hdfs import InsecureClient import json # 替换为你的NameNode地址和用户名 client = InsecureClient('http://your-nn-host:50070', user='your-username') json_data = {"a":"b"} with client.write('/app/hdp/logs/json/a.json', overwrite=True) as writer: writer.write(json.dumps(json_data).encode())
内容的提问来源于stack exchange,提问作者SRIRAM RAMACHANDRAN
相关产品推荐
相关产品推荐

