Вы можете использовать модуль subprocess
.
Следующая функция будет работать для данных, которые вы уже сохранили локально.Например, если вы сохраните фрейм данных в csv, вы передадите имя csv в save_to_hdfs
, и оно выбросит его в hdfs.Я уверен, что есть способ напрямую перебрасывать фрейм данных, но это поможет вам начать.
Вот пример функции для сохранения локального объекта, output
, в user/<your_name>/<output_name>
в hdfs.
import os
from subprocess import PIPE, Popen
def save_to_hdfs(output):
"""
Save a file in local scope to hdfs.
Note, this performs a forced put - any file with the same name will be
overwritten.
"""
hdfs_path = os.path.join(os.sep, 'user', '<your_name>', output)
put = Popen(["hadoop", "fs", "-put", "-f", output, hdfs_path], stdin=PIPE, bufsize=-1)
put.communicate()
# example
df = pd.DataFrame(...)
output_file = 'yourdata.csv'
dataframe.to_csv(output_file)
save_to_hdfs(output_file)
# remove locally created file (so it doesn't pollute nodes)
os.remove(output_file)