使用 python 将 JSON 保存到 HDFS

Save JSON to HDFS using python

我有一个 python 脚本,它当前访问一个 API,其中 returns JSON。然后它获取 JSON 字符串并将其作为文件保存在本地文件系统上,然后我将其手动移动到 HDFS 中。我想更改此设置,以便我的 python 脚本直接保存到 HDFS,而不是先访问本地文件系统。我目前正在尝试使用 HDFS 和 DFS 命令保存文件,但我认为复制命令不是执行此操作的正确方法,因为当我尝试时它不是文件而是 JSON 字符串保存它。

当前代码

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')

查看 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 字符串通过管道传输到子进程。

我认为问题与此线程相同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)))

它对我的情况有帮助:

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