使用python

时间:2015-08-19 15:23:44

标签: python hadoop hdfs

我有一个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')

3 个答案:

答案 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))