You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:16:43