如何使用python在hadoop中保存文件

use*_*459 9 python hadoop

题:

我开始学习hadoop,但是,我需要使用python将很多文件保存到其中。我似乎无法弄清楚我做错了什么。谁能帮我这个?

下面是我的代码。我认为这HDFS_PATH是正确的,因为我在安装时没有在设置中更改它。该pythonfile.txt是我的桌面上(所以是通过命令行运行Python代码)。

代码:

import hadoopy
import os
hdfs_path ='hdfs://localhost:9000/python' 

def main():
    hadoopy.writetb(hdfs_path, [('pythonfile.txt',open('pythonfile.txt').read())])

main()
Run Code Online (Sandbox Code Playgroud)

输出 当我运行上面的代码时,我得到的只是python本身的一个目录。

iMac-van-Brian:desktop Brian$ $HADOOP_HOME/bin/hadoop dfs -ls /python

DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

14/10/28 11:30:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
-rw-r--r--   1 Brian supergroup        236 2014-10-28 11:30 /python
Run Code Online (Sandbox Code Playgroud)

Jar*_*ber 7

这是该subprocess模块的一项非常典型的任务。解决方案如下所示:

put = Popen(["hadoop", "fs", "-put", <path/to/file>, <path/to/hdfs/file], stdin=PIPE, bufsize=-1)
put.communicate()
Run Code Online (Sandbox Code Playgroud)

完整示例

假设您在服务器上并与 hdfs 建立了经过验证的连接(例如,您已经调用了 a .keytab)。

您刚刚从 a 创建了一个 csvpandas.DataFrame并想将其放入 hdfs。

然后,您可以将文件上传到 hdfs,如下所示:

import os 

import pandas as pd

from subprocess import PIPE, Popen


# define path to saved file
file_name = "saved_file.csv"

# create a pandas.DataFrame
sales = {'account': ['Jones LLC', 'Alpha Co', 'Blue Inc'], 'Jan': [150, 200, 50]}
df = pd.DataFrame.from_dict(sales)

# save your pandas.DataFrame to csv (this could be anything, not necessarily a pandas.DataFrame)
df.to_csv(file_name)

# create path to your username on hdfs
hdfs_path = os.path.join(os.sep, 'user', '<your-user-name>', file_name)

# put csv into hdfs
put = Popen(["hadoop", "fs", "-put", file_name, hdfs_path], stdin=PIPE, bufsize=-1)
put.communicate()
Run Code Online (Sandbox Code Playgroud)

然后 csv 文件将存在于/user/<your-user-name/saved_file.csv.

- 如果您从 Hadoop 中调用的 Python 脚本创建此文件,则中间 csv 文件可能会存储在某些随机节点上。由于(大概)不再需要此文件,因此最好将其删除,以免每次调用脚本时都污染节点。您可以简单地添加os.remove(file_name)为上述脚本的最后一行来解决此问题。


Leg*_*ato 1

我有一种感觉,您正在写入一个名为“/python”的文件,而您希望它是存储该文件的目录

什么是

hdfs dfs -cat /python
Run Code Online (Sandbox Code Playgroud)

给你看?

如果它显示文件内容,您需要做的就是编辑 hdfs_path 以包含文件名(您应该首先使用 -rm 删除 /python)否则,使用 pydoop (pip install pydoop) 并执行以下操作:

import pydoop.hdfs as hdfs

from_path = '/tmp/infile.txt'
to_path ='hdfs://localhost:9000/python/outfile.txt'
hdfs.put(from_path, to_path)
Run Code Online (Sandbox Code Playgroud)