我有一个python脚本,它当前访问返回JSON的API。然后它接受JSON字符串并将其作为文件保存在本地文件系统上,然后我将其手动移动到HDFS中。我想改变它,所以我的python脚本直接保存到HDFS,而不是首先命中本地文件系统。我目前正在尝试使用HDFS和DFS命令保存文件,但我不认为复制命令是正确的方法,因为它不是文件,而是我尝试保存时的JSON字符串。 / p>
当前代码
import urllib2
import json
import os
f = urllib2.urlopen('RESTful_API_URL.json')
json_string = json.loads(f.read().decode('utf-8'))
with open('\home\user\filename.json', 'w') as outfile:
json.dump(json_string,outfile)
新代码
f = urllib2.urlopen('RESTful_API_URL.json')
json_string = json.loads(f.read().decode('utf-8'))
os.environ['json_string'] = json.dump(json_string)
os.system('hdfs dfs -cp -f $json_string hdfs/user/test')
答案 0 :(得分:5)
我认为这个帖子Stream data into hdfs directly without copying的问题是一样的。
首先,此命令可以将stdin重定向到hdfs文件,
hadoop fs -put - /path/to/file/in/hdfs.txt
然后,您可以在python中执行此操作,
os.system('echo "%s" | hadoop fs -put - /path/to/file/in/hdfs.txt' %(json.dump(json_string)))
答案 1 :(得分:1)
在http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html#put
查看HDFS put命令您可以使用标准输入从命令行放入HDFS,语法如下(-put -
表示从标准输入读取)。
hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile
如果您可以在python代码中将此命令作为子进程启动,那么您应该能够将json字符串传递给子进程。
答案 2 :(得分:0)
它对我的情况有帮助:
import os
import requests
r = requests.get(url = url,headers=headers)
json_string = r.json()
os.system('echo "%s" | hadoop fs -put - /<your_hdfs_path>/json_name.json' %(json_string))